home *** CD-ROM | disk | FTP | other *** search
/ PC Zone 88 / PCZONE#88APR00.iso / Unreal Tournament / Mods / UTTeamLMS.umod < prev   
INI File  |  2000-02-02  |  83KB  |  1,833 lines

  1. [Setup]
  2. Product=Team LMS Mod
  3. Version=100
  4. Archive=UTTeamLMS.umod
  5. SrcPath=.
  6. MasterPath=..
  7. Requires=UnrealTournamentRequirement
  8. Group=SetupGroup
  9. Group=TeamLMSFilesGroup
  10.  
  11. [UnrealTournamentRequirement]
  12. Product=UnrealTournament
  13. Version=
  14.  
  15. [SetupGroup]
  16. Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=455,Flags=3)
  17. Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=538,Flags=3)
  18.  
  19. [TeamLMSFilesGroup]
  20. File=(Src=System\TLastmanStanding.u,Size=77416)
  21. File=(Src=System\TLastManStanding.int,Size=217)
  22. File=(Src=TLastManStanding\TLastManStanding.txt,Size=3746)
  23.  
  24. [Setup]
  25. LocalProduct=Team LMS Mod
  26. ReadMe=TLastManStanding\TLastManStanding.txt
  27. SetupWindowTitle=Team Last Man Standing
  28. AutoplayWindowTitle=Team LMS Mod Options
  29. ProductURL=mailto:riever@botgod.org.uk
  30. VersionURL=mailto:riever@botgod.org.uk
  31. Developer=Connor "RiEvEr" Caple
  32. DeveloperURL=mailto:riever@botgod.org.uk
  33.  
  34. [UnrealTournamentRequirement]
  35. LocalProduct=UnrealTournament
  36. ProductURL=http://www.unrealtournament.com/
  37. VersionURL=http://unreal.epicgames.com/
  38. Developer=Epic Games, Inc.
  39. DeveloperURL=http://www.epicgames.com/
  40. ┴â*₧D¿@$Ç╟X─╙▒│!╤£≈¿None GiveWeaponSetProgressMessageBotCalcTeamScoresLogTeamChange
  41. Spectator    GetValueTLastmanStanding PlayerPawn    SetValueSetTextFindPlayerStart
  42. SetOrders ClearOrders ChangeTeamPlayTeleportEffectCoreSetFont SetHelpText
  43. CommanderFollowSystem
  44. ReBalanceCheckEndGameBroadcastLocalizedMessageSetBotOrdersCreateControl
  45. AddToTeam
  46. FreelanceMaxTeamsChangedut_jumpboots
  47. InventoryBalancePlayersChanged
  48. FFChangedTournamentPlayer TeamCannon    FallbackSpecialNavigLogEventStringRoamingSetProgressColorCreatedUWindowClientChangeTeamAddDefaultInventoryClientSetRotationGetTimeStamp    FlushLogLogPlayerConnectTweenToRunning
  49. GameEnded
  50. ScoreKill
  51. PostLoginAmmoTimer    InitGamePostBeginPlayLoginSetNumericOnlyMaxTeamsTextBalancePlayersTextBalancePlayersHelpMaxTeamsHelpNotifyGetTeamArenaYellAtDied IsRelevant BeforePaintMaxCommanders CheckReadySwitchToBestWeaponNetWaitReduceDamageSendBotToGoal    SpawnBot HandleTieUpKilledWaitForPointModifyBehaviour SameTeamAsDefensePointGiveToSetWeaponStay Ambushpoint    SuicidedFeigningDeathRestartPlayerSetMultiSkinAssessBotAttitude    IsOnTeam CanSpectatePlayWinMessagePlayStartUpMessageLogGameParametersStartUpMessage PickupQueryInitGameReplicationInfoEndGame SetEndCams    OneOnOneLogoutPriorityObjective    GameNameFindSpecialAttractionFor    gibbedByEngineClientGameEndedFFTextFFHelp CHSpectatorUTTeamLMSRCWindowSetMaxLength    SetRangebAlwaysForceRespawnFindTeamByNameSuccessfulGameGetMultiSkinAddBotPlayerSpectatingRulesMenuTypeSetAttractionStateForBotpackDefend NeedPlayersSetDefenseFor    GetRulesClearProgressMessagesInitRatedGameCalcEndStatsSetupNetworkOptionsPickAmbushSpotForGoalTeamScore BeaconNameUMenu    SetEnemyUTTeamLMSRSClientRelativeStrengthSetDelayedNotifyUTMenuItem
  52. GameClass NumPlayersMLDamageKillerNbWaitingPlayerRegion    VelocityReasonAccelerationEnemyTeamID SpawnClass    PawnListbCoopWeaponMode bGameEndedNumSpectatorsScorebIsSpectatorPZone ViewTargetHealth NextMutator
  53. bDeleteMe LocalPlayer    nextPawn
  54. StartSpot
  55. NewPlayer TimeSecondsInTeamNetModeincomingNameDestNavigationPointListaPlayerMutatorViewerinjuredweaptakennextNavigationPoint markedItem TeamNumber    myMarkerTeamNum    FaceName    RotationinstigatedByNumRemainingTime
  56. bHeldItemGameEndedComments    SkinNameOther    Location PointRegion ReturnValue UnrealShareMaxSpectatorsbRestartLevelR WhiteColor bBehindViewSoundDampeningPlayerReStartStateStyleY BaseMutator    LocalLog
  57. ResultSet    GameInfoNameProperty ClientClass    WorldLogPortalPackageClassUWindowHSliderControlUWindowScrollingDialogClientUWindowDialogClientWindowUWindowCheckboxUWindowDialogControlUWindowWindowSetSize    PawnLinkAlignWinLeftEditBoxWidth    WinWidth SliderWidthExitingDEDesiredWidthTel    bSuccessControlOffset
  58. CenterPos CenterWidth MinPlayers foundStart Teleporter PlayerStartInv
  59. TeamColorAggressivenessInventorySpotTeamsNavigationPointPlayerReplicationInfo    TeamInfo    MaxTeams MaxTeamSizebChangeLevelsSize CampingRatebNoClearSpecial OrderObject AmbushSpot
  60. Candidate
  61. BestScore    NextDist OtherPlayer
  62. FragLimit
  63. TimeLimitNumBotsbSpawnInTeamAreabNoTeamChangesFriendlyFireScale    TeamName NextBotTeam DesiredTeamNewTeamSmallestTeamaTeamadjust
  64. TeamIndexNewBot
  65. bIsPlayerStatLogGameReplicationInfo
  66. ScaleGlowbIsPawn    bCheckedbNetworkGameStructUMenuBotmatchClientWindowUMenuGameRulesBaseControlWidth ControlLeftControlRightBotmatchParent Initialized ButtonWidth ButtonLeft    FFSliderFFS RespawnTimeDeathMatchPlusObjectProperty    ViewportGFloatPropertyTeamGamePlusRatedMatchInfoCanvasStationaryPawn    Function    bEnabledTeamBOrdersColor    AmmoTypeViewRotationLevel AmmoAmountMaxAmmoActorSkillPawnLadderInventory    DieCount
  67. KillCountCTFGameCollisionRadiusSingleWaitingMessageSAssaultChallengeTeamHUD ScriptTextibTutorialGameWFPlayer DamageTypeBoolPropertyOptionsMaxAllowedTeamsCollisionHeightbHidden    gamegoalObject TextBufferWeapon
  68. LevelInfo StrPropertyarmor2GameEndedMessageTeamChangeMessageStartUpTeamMessagebBalanceTeamsStructPropertyTourneyMessage
  69. CountDownClassPropertyTournamentGameInfoTournamentGameReplicationInfoBotReplicationInfoDesiredHeightLMSOutMessageDeathMatchMessagebNovice
  70. bKamikaze bRatedGame RealOrdersbRequireReadybFulfilledSpecial bStartMatchLastStartSpot RatedPlayerEndTime
  71. LadderObjLadderPlayerRMIaBotNumSupportingPlayerbPlayersBalanceTeams bBalancing TeamPrefixPlayerTeamNum    BestTeambigsmallbigsize
  72. smallsizeOldStartSpotMinSizeLeavingBumperBumpee    PrioritybHighDetailGhostsLives TotalKills
  73. NumGhostsAltStartupMessagebArenaMutatorOldFragLimitStillPlaying bStillHumantotalAErrorTagUTRulesCWindowFixedAreaClassBestXMaxTeamsEditBalancePlayersCheck IntPropertyCUWindowEditControlByteProperty
  74. PawnLinkD
  75. TeamFoundMÇâHÇâT¢Çâ&âAâTÇâù    Ççç/â8ô@gjÇs⌐Dâ ÇôU¼âR£cÇìO¡Bù¡B;#âQÇçôëeÇâ<âIÇâUâGâÇôÇçë'Ççâ_âââMÇâh`Çì=ÇâǬùÇâfbEzÇâ\ùçç?âE"â4qR«2ùA┬LÇIë$¡a╥%Çâ)ëWuyZ1lÇctd@XôMiJσ5Çâ@~Wkǽô\FÇâr@@]Ç@mYÇçTÇ~rÉ@JÇ@CÇπ_ÇâYXçoFùÇ«vÇKÇâ{Ç@nÇ@IÇ@LÇ6ÇzÉpÇâ.ÇâRÇPÇσVÇÇ@SÇ@^Ç@Ç@sÇ@}ÇôZÇ█]Ç@jÇ@NÇ£@VÇ@╢PEq                  2>bçñC╢?Ñ╩₧+X½å▒ 5ò⌐|δ[$⌐|δ[$⌐|δ[$¢t╡≡¢t╡≡¢t╡≡¢t╡≡₧+X½å▒ 5ò¢t╡≡₧+X½å▒ 5ò¼|.X┌¼|.X┌¼|.X┌¢t╡≡¢t╡≡¢t╡≡¢t╡≡⌐|δ[$⌐|δ[$⌐|δ[$₧+X¼|.X┌¼|.X┌¼|.X┌¼|.X┌₧+X₧+X¢t╡≡¢t╡≡¢t╡≡¢t╡≡¢t╡≡¢t╡≡¢t╡≡¢t╡≡₧+X½å▒ 5ò₧+X½å▒ 5ò¼|.X┌₧+X½å▒ 5ò⌐|δ[$₧+X½å▒ 5ò⌐|δ[$⌐|δ[$⌐|δ[$⌐|δ[$MH+╛<]
  76. Max Teams?]TRThe maximum number of different teams players are allowed to join, for this game.=]Force Team Balance>]trIf checked, this option forces players joining the game to be placed on the team which best keeps teams balanced.nMFriendly Fire:o]QOSlide to adjust the amount of damage friendly fire imparts to other teammates.Ç■oHël20éÜ╦%
  77. ┤╟?%╦,╫É,<╦ NÇ┘iev÷ìgíN%ûI&eûIó[▒Iû┤N┤NIûÑI-┌'¥ÜN╓:╟ïæ'ƒ( cÇçÇßmgh∩/g$ ╨fONià.ÿ¿âw.*lé.a/!r.ç.╚O.ç. !*..Ñ ■l-[£^w --┼`═╠L╛B`»═╠L╛½═╠╠=-╒zé'-º░'ïí?&$uäé'-º3Ü:-ïæ:'ïæCé'a/!$-.┘'R:-ïæ$u(--√$urä'a/!$,▒- K'»-ⁿ`$u$ ╓d07òf╓0ÿ¿dw0*M0a!X0 k000Ñ °u
  78. E╥╠b╟    ÿ∞┼w    *«é    a/!Vü    -⌡1■
  79. ╩!}ué    a/!S/Ü:.ñ    ε:
  80. ïæär.ñ
  81. »*4ù:.ñ    ═:.ñ
  82. »═
  83. ».┼    rréÜ:.ñ    ═:.ñ
  84. »═
  85. ░├═╠╠>
  86. ».┼    ..ééér.ñ
  87. »*2░ß╪     ª
  88. ╚ ª?▄)b$
  89. ╚ ª     ª är
  90. »*
  91. ░├?
  92. ».┼    ««är
  93. »*L▒ß╪
  94.  ª
  95. » ªß╪
  96.  ª     ª
  97. ».┼            ∩ BÇç═H[B{Y╟═[Z-∞'╜ó,/a0 «DVDU10 ≈Aq@Nk#≡pp\timelimit\S╦pp\minplayers\S pp\changelevels\T-τpp\maxteams\Sópp\balanceteams\T-╨pp\playersbalanceteams\T-╠ppp\friendlyfire\SD½╜?,d% Ç@Çù╧pYEo&=éé-▀¢:ÿ╗:$¢:ÿ╗:$'U░ïí?& ⌡%ï1ÿ¿√w1*Σé1-º│1ïí?&╕1ïí¼┼'711ÑëUa/!ï-▐'ï-∩'q!3(> =, vr>*(-\a > ª-\> 'a+> ▒ Σ ▒ π# ┴#╘╘.> ▒-≥(εε░ïí?&█-`╬$µ?∞-≥'┬!ya'''--\ hÇç╔w!{╜#a╣gw!δ*dü!a!%!-┼'! ═╠╠=! q!%!&╖╖ü!a!(!-┼'! ═╠╠=! q!(!& ≡ByLNj( ▌CSj╕ß`( Ç{ÇçÇÇ└`9H╠
  98. Σ%└û,ûa ëûÖ%û┤û╞÷û╓.└ΦσûÑ└Γ-─╜ó, D½ß╦[7`¡í┴r7* ╦77I'pppppp7/∞,    game∞,    GoalTeamScore∞,    SD╟7L'pppppp7/∞,    game∞,    FriendlyFireScale∞,    U╜ nÇç_(¿ÅyΓU%7ûU,Uû┤ÑU(ÿ¿αw(*╔é(-º¢:(ïæ, ╕:(ïæû┤(ïí((ÑK ┼vNÖj( Ç╪kr│ÿ`* Çì├aYJ                  E#zε├╤$+╛,Çⁿh_±╫⌡A╤Ñ jé-├¢:ÿ╗:$∩Ñ àΦÑ ╡▒╟?%¿SD╟≥Ñ ┴û:ïæ,2):ïæ ▄═ @p¿°:ïæû╞.Ñ 6─Q=, 6ΦQ=, 6 Q=, )Q ┴ü-─≈Ñ ≤Ü:ÿ╗:$±Ñ  ╘\clW╘.└ΦΘ% `Ç∙Qxx%rS₧ M5r *τFailed to spawn bot(╬é-╨    ü-─h%ûÖF%4&╦û4ó┴û4ûÖhh4ûÖF4Ñ4o∞F: ïæ ïæ=, WäÜF, ü F ╬Ñ╬WÖ╬ó╬%-τB =, w* a  ª a+ ▒  Σ ▒ a+  ▒  'B  ' fw▓*▓ ▓öw│*│ │' ⌡v}b─é3 ░}ïí?&(⌡}_ Ç>ÇÇ┴K-╣â∩.äa/!é-├    ù·% ┴Botpack.ShockRifleBotpack.UT_BioRifleBotpack.RipperBotpack.UT_FlakCannonVa/!    Botpack.SniperRifleBotpack.PulseGunBotpack.Minigun2Botpack.UT_EightballIR├;░R333?Botpack.SniperRifleBotpack.PulseGun·░R═╠╠>Botpack.Minigun2Botpack.UT_Eightball8Botpack.UT_EightballBotpack.Minigun2Botpack.Minigun2Botpack.UT_Eightball╚░R«Ga?Botpack.SniperRifleBotpack.PulseGunBotpack.PulseGunBotpack.SniperRifleφ¢w*H.«äéwH*wH▌*H▌φH▌╚φa ╞φw*-█'╦ T mhclass UTTeamLMSRCWindow extends UTRulesCWindow;
  99.  
  100. // Team Score
  101. //var UWindowEditControl TeamScoreEdit;
  102. //var localized string TeamScoreText;
  103. //var localized string TeamScoreHelp;
  104.  
  105. // Max Teams
  106. var UWindowEditControl MaxTeamsEdit;
  107. var localized string MaxTeamsText;
  108. var localized string MaxTeamsHelp;
  109.  
  110. // PlayersBalanceTeams
  111. var UWindowCheckbox BalancePlayersCheck;
  112. var localized string BalancePlayersText;
  113. var localized string BalancePlayersHelp;
  114.  
  115. var int MaxAllowedTeams;
  116.  
  117. // Friendly Fire Scale
  118. var UWindowHSliderControl FFSlider;
  119. var localized string FFText;
  120. var localized string FFHelp;
  121.  
  122. function Created()
  123. {
  124.     local int FFS;
  125.     local int ControlWidth, ControlLeft, ControlRight;
  126.     local int CenterWidth, CenterPos, ButtonWidth, ButtonLeft;
  127.  
  128.     ControlWidth = WinWidth/2.5;
  129.     ControlLeft = (WinWidth/2 - ControlWidth)/2;
  130.     ControlRight = WinWidth/2 + ControlLeft;
  131.     
  132.     CenterWidth = (WinWidth/4)*3;
  133.     CenterPos = (WinWidth - CenterWidth)/2;
  134.  
  135.     ButtonWidth = WinWidth - 140;
  136.     ButtonLeft = WinWidth - ButtonWidth - 40;
  137.  
  138.     Initialized = False;
  139. /*
  140.     // Team Score Limit
  141.     TeamScoreEdit = UWindowEditControl(CreateControl(class'UWindowEditControl', ControlLeft, 20, ControlWidth, 1));
  142.     TeamScoreEdit.SetText(TeamScoreText);
  143.     TeamScoreEdit.SetHelpText(TeamScoreHelp);
  144.     TeamScoreEdit.SetFont(F_Normal);
  145.     TeamScoreEdit.SetNumericOnly(True);
  146.     TeamScoreEdit.SetMaxLength(3);
  147.     TeamScoreEdit.Align = TA_Right;
  148. */
  149.     Super.Created();
  150.  
  151.     if(MaxTeamsEdit != None)
  152.         MaxTeamsEdit.SetValue(string(class<TeamGamePlus>(BotmatchParent.GameClass).Default.MaxTeams));
  153.     MaxAllowedTeams = class<TeamGamePlus>(BotmatchParent.GameClass).Default.MaxAllowedTeams;
  154.     if(BalancePlayersCheck != None)
  155.     BalancePlayersCheck.bChecked = class<TeamGamePlus>(BotmatchParent.GameClass).Default.bPlayersBalanceTeams;
  156.  
  157.     DesiredWidth = 220;
  158.     DesiredHeight = 165;
  159.  
  160.     Initialized = False;
  161.  
  162. //    TeamScoreEdit.SetValue(string(int(Class<TeamGamePlus>(BotmatchParent.GameClass).Default.GoalTeamScore)));
  163.  
  164.     // Friendly Fire Scale
  165.     FFSlider = UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1));
  166.     FFSlider.SetRange(0, 10, 1);
  167.     FFS = Class<TeamGamePlus>(BotmatchParent.GameClass).Default.FriendlyFireScale * 10;
  168.     FFSlider.SetValue(FFS);
  169.     FFSlider.SetText(FFText$" ["$FFS*10$"%]:");
  170.     FFSlider.SetHelpText(FFHelp);
  171.     FFSlider.SetFont(F_Normal);
  172.  
  173. //    FragEdit.HideWindow();
  174.  
  175.     Initialized = True;
  176. }
  177.  
  178. function SetupNetworkOptions()
  179. {
  180.     local int ControlWidth, ControlLeft, ControlRight;
  181.     local int CenterWidth, CenterPos, ButtonWidth, ButtonLeft;
  182.  
  183.     // don't call UTRulesCWindow's version (force respawn)
  184.     Super(UMenuGameRulesBase).SetupNetworkOptions();
  185.  
  186.     ControlWidth = WinWidth/2.5;
  187.     ControlLeft = (WinWidth/2 - ControlWidth)/2;
  188.     ControlRight = WinWidth/2 + ControlLeft;
  189.  
  190.     CenterWidth = (WinWidth/4)*3;
  191.     CenterPos = (WinWidth - CenterWidth)/2;
  192.  
  193.     if(BotmatchParent.bNetworkGame)
  194.     {
  195.         BalancePlayersCheck = UWindowCheckbox(CreateControl(class'UWindowCheckbox', ControlLeft, ControlOffset, ControlWidth, 1));
  196.         BalancePlayersCheck.SetText(BalancePlayersText);
  197.         BalancePlayersCheck.SetHelpText(BalancePlayersHelp);
  198.         BalancePlayersCheck.SetFont(F_Normal);
  199.         BalancePlayersCheck.Align = TA_Right;
  200.     }
  201.  
  202.     if(
  203.         !ClassIsChildOf( BotmatchParent.GameClass, class'CTFGame' ) &&
  204.         !ClassIsChildOf( BotmatchParent.GameClass, class'Assault' )
  205.     )
  206.     {
  207.         MaxTeamsEdit = UWindowEditControl(CreateControl(class'UWindowEditControl', ControlRight, ControlOffset, ControlWidth, 1));
  208.  
  209.         MaxTeamsEdit.SetText(MaxTeamsText);
  210.         MaxTeamsEdit.SetHelpText(MaxTeamsHelp);
  211.         MaxTeamsEdit.SetFont(F_Normal);
  212.         MaxTeamsEdit.SetNumericOnly(True);
  213.         MaxTeamsEdit.SetMaxLength(3);
  214.         MaxTeamsEdit.Align = TA_Right;
  215.         MaxTeamsEdit.SetDelayedNotify(True);
  216.     }
  217.     ControlOffset += 25;
  218.  
  219. /*    if(BotmatchParent.bNetworkGame)
  220.     {
  221.         if(ClassIsChildOf(BotmatchParent.GameClass, class'CTFGame'))
  222.             ControlOffset -= 25;
  223.  
  224.         ForceRespawnCheck = UWindowCheckbox(CreateControl(class'UWindowCheckbox', ControlLeft, ControlOffset, ControlWidth, 1));
  225.         ForceRespawnCheck.SetText(ForceRespawnText);
  226.         ForceRespawnCheck.SetHelpText(ForceRespawnHelp);
  227.         ForceRespawnCheck.SetFont(F_Normal);
  228.         ForceRespawnCheck.Align = TA_Right;    
  229.         ControlOffset += 25;
  230.     }*/
  231. }
  232.  
  233. function BeforePaint(Canvas C, float X, float Y)
  234. {
  235.     local int ControlWidth, ControlLeft, ControlRight;
  236.     local int CenterWidth, CenterPos, ButtonWidth, ButtonLeft;
  237.  
  238.     Super.BeforePaint(C, X, Y);
  239.  
  240.     ControlWidth = WinWidth/2.5;
  241.     ControlLeft = (WinWidth/2 - ControlWidth)/2;
  242.     ControlRight = WinWidth/2 + ControlLeft;
  243.  
  244.     CenterWidth = (WinWidth/4)*3;
  245.     CenterPos = (WinWidth - CenterWidth)/2;
  246. /*
  247.     TeamScoreEdit.SetSize(ControlWidth, 1);
  248.     TeamScoreEdit.WinLeft = ControlLeft;
  249.     TeamScoreEdit.EditBoxWidth = 20;
  250. */
  251.     if( BalancePlayersCheck != None )
  252.     {
  253.         BalancePlayersCheck.SetSize(ControlWidth, 1);
  254.         BalancePlayersCheck.WinLeft = ControlLeft;
  255.     }
  256.  
  257.     if(MaxTeamsEdit != None)
  258.     {
  259.         MaxTeamsEdit.SetSize(ControlWidth, 1);
  260.         if( BalancePlayersCheck != None )
  261.             MaxTeamsEdit.WinLeft = ControlRight;
  262.         else
  263.             MaxTeamsEdit.WinLeft = ControlLeft;
  264.         MaxTeamsEdit.EditBoxWidth = 20;
  265.     }
  266. /*
  267.     if(ForceRespawnCheck != None && ClassIsChildOf(BotmatchParent.GameClass, class'CTFGame'))
  268.         ForceRespawnCheck.WinLeft = ControlRight;
  269. */
  270.     FFSlider.SetSize(CenterWidth, 1);
  271.     FFSlider.SliderWidth = 90;
  272.     FFSlider.WinLeft = CenterPos;
  273. }
  274.  
  275.  
  276. function Notify(UWindowDialogControl C, byte E)
  277. {
  278.     if (!Initialized)
  279.         return;
  280.  
  281.     Super.Notify(C, E);
  282.  
  283.     switch(E)
  284.     {
  285.     case DE_Change:
  286.         switch (C)
  287.         {
  288. /*            case TeamScoreEdit:
  289.                 TeamScoreChanged();
  290.                 break;*/
  291.             case FFSlider:
  292.                 FFChanged();
  293.                 break;
  294.             case MaxTeamsEdit:
  295.                 MaxTeamsChanged();
  296.                 break;
  297.             case BalancePlayersCheck:
  298.                 BalancePlayersChanged();
  299.                 break;
  300.         }
  301.     }
  302. }
  303.  
  304. function BalancePlayersChanged()
  305. {
  306.     Class<TeamGamePlus>(BotmatchParent.GameClass).Default.bPlayersBalanceTeams = BalancePlayersCheck.bChecked;
  307. }
  308.  
  309. singular function MaxTeamsChanged()
  310. {
  311.     if(Int(MaxTeamsEdit.GetValue()) > MaxAllowedTeams)
  312.         MaxTeamsEdit.SetValue(string(MaxAllowedTeams));
  313.     if(Int(MaxTeamsEdit.GetValue()) < 2)
  314.         MaxTeamsEdit.SetValue("2");
  315.  
  316.     Class<TeamGamePlus>(BotmatchParent.GameClass).Default.MaxTeams = int(MaxTeamsEdit.GetValue());
  317. }
  318. /*
  319. function TeamScoreChanged()
  320. {
  321.     Class<TeamGamePlus>(BotmatchParent.GameClass).Default.GoalTeamScore = int(TeamScoreEdit.GetValue());
  322. }
  323. */
  324. function FFChanged()
  325. {
  326.     Class<TeamGamePlus>(BotmatchParent.GameClass).Default.FriendlyFireScale = FFSlider.GetValue() / 10;
  327.     FFSlider.SetText(FFText$" ["$int(FFSlider.GetValue()*10)$"%]:");
  328. }
  329.  
  330. µVG\ÅR($Ü:GïæK'( xÇçÇë≤OwQ[ï2wïí?╕w╤├ ⌠bxARûx,xû* √UXfbéïÜôÆ║╣b, Ç■*Y  b├*■ {«//=============================================================================
  331. // TLastManStanding
  332. //
  333. // RiEvEr 
  334. // /*
  335. // * $Log: /UT/Classes/TLastManStanding.uc $
  336. // * 
  337. // * 5     6/01/00 12:34 Riever
  338. // * Team scores now appear on HUD and are updated regularly.
  339. // * 
  340. // * 4     6/01/00 7:40 Riever
  341. // * Fixed MatchEnding and altered ScoreKill to remove bot orders that
  342. // * support ghosts.
  343. // * 
  344. // * 3     5/01/00 19:18 Riever
  345. // * Added rest of LMS code - endgame not working yet...
  346. // * 
  347. // * 2     5/01/00 14:42 Riever
  348. // * Added various parts to the code ready for TLMS implementation. I'm
  349. // * doingthis slowly so I can test the effect of each code segment addition
  350. // * before continuing.
  351. // */
  352. //=============================================================================
  353. class TLastManStanding extends TeamGamePlus
  354.     config;
  355. /*
  356. #exec MESH IMPORT MESH=Flag1M ANIVFILE=MODELS\flag_a.3D DATAFILE=MODELS\flag_d.3D X=0 Y=0 Z=0 ZeroTex=1
  357. #exec MESH ORIGIN MESH=Flag1M X=0 Y=100 Z=0 YAW=128 PITCH=0 ROLL=-64
  358. #exec MESH SEQUENCE MESH=flag1M SEQ=All    STARTFRAME=0  NUMFRAMES=14
  359. #exec MESH SEQUENCE MESH=flag1M SEQ=Wave  STARTFRAME=1  NUMFRAMES=13
  360. #exec TEXTURE IMPORT NAME=JFlag11 FILE=MODELS\flag_red.PCX GROUP=Skins
  361. #exec TEXTURE IMPORT NAME=JFlag12 FILE=MODELS\flag_blue.PCX GROUP=Skins
  362. #exec TEXTURE IMPORT NAME=JFlag13 FILE=MODELS\flag_green.PCX GROUP=Skins
  363. #exec TEXTURE IMPORT NAME=JFlag14 FILE=MODELS\flag_yellow.PCX GROUP=Skins
  364. #exec TEXTURE IMPORT NAME=JFlag15 FILE=MODELS\flag3.PCX GROUP=Skins
  365. #exec MESHMAP SCALE MESHMAP=flag1M X=0.1 Y=0.1 Z=0.2
  366. #exec MESHMAP SETTEXTURE MESHMAP=flag1M NUM=0 TEXTURE=Jflag11
  367. */    
  368. /*
  369. var()         bool   bSpawnInTeamArea;
  370. var()         bool    bScoreTeamKills;
  371. var() config bool    bNoTeamChanges;
  372. var             int    NumSupportingPlayer; 
  373. var globalconfig     bool    bBalanceTeams;    // bots balance teams
  374. var globalconfig     bool    bPlayersBalanceTeams;    // players balance teams
  375. var             bool    bBalancing;
  376. var() config float  FriendlyFireScale; //scale friendly fire damage by this value
  377. var() config int    MaxTeams; //Maximum number of teams allowed in (up to MaxAllowedTeams)
  378. var             int    MaxAllowedTeams;
  379. var    TeamInfo Teams[4]; // Red, Blue, Green, Gold
  380. var() config float  GoalTeamScore; //like fraglimit
  381. var() config int    MaxTeamSize;
  382. var  localized string StartUpTeamMessage, TeamChangeMessage,TeamPrefix;
  383. var localized string TeamColor[4];
  384.  
  385. var        int            NextBotTeam;
  386. var byte TEAM_Red, TEAM_Blue, TEAM_Green, TEAM_Gold;
  387. var name CurrentOrders[4];
  388. var int PlayerTeamNum;
  389. */
  390. //RiEvEr
  391. var    config    bool    bHighDetailGhosts;
  392. var()    int    Lives;
  393. var int TotalKills, NumGhosts;
  394. var        PlayerPawn    LocalPlayer;
  395. var localized string AltStartupMessage;
  396. //R
  397.  
  398. function PostBeginPlay()
  399. {
  400.     local int i;
  401.     for (i=0;i<4;i++)
  402.     {
  403.         Teams[i] = Spawn(class'TeamInfo');
  404.         Teams[i].Size = 0;
  405.         Teams[i].Score = 0;
  406.         Teams[i].TeamName = TeamColor[i];
  407.         Teams[i].TeamIndex = i;
  408.         TournamentGameReplicationInfo(GameReplicationInfo).Teams[i] = Teams[i];
  409.     }
  410.     
  411.     Super.PostBeginPlay();
  412.  
  413.     if ( bRatedGame )
  414.     {
  415.         FriendlyFireScale = 0;
  416.         MaxTeams = 2;
  417.     }
  418. }
  419.  
  420. event InitGame( string Options, out string Error )
  421. {
  422.     //RiEvEr
  423.     TimeLimit = 0;
  424.     //R
  425.     Super.InitGame(Options, Error);
  426.     MaxTeams = Min(MaxTeams,MaxAllowedTeams);
  427.     //RiEvEr
  428.     if( FragLimit == 0 )
  429.         Lives = 10;
  430.     else
  431.         Lives = FragLimit;
  432.     //R
  433. }
  434.  
  435. function InitGameReplicationInfo()
  436. {
  437.     Super.InitGameReplicationInfo();
  438.  
  439.     //RiEvEr
  440.     TournamentGameReplicationInfo(GameReplicationInfo).GoalTeamScore = 0;
  441. //    TournamentGameReplicationInfo(GameReplicationInfo).GoalTeamScore = GoalTeamScore;
  442.     //R
  443. }
  444.  
  445. // Set game settings based on ladder information.
  446. // Called when RatedPlayer logs in.
  447. function InitRatedGame(LadderInventory LadderObj, PlayerPawn LadderPlayer)
  448. {
  449.     local class<RatedMatchInfo> RMI;
  450.     local Weapon W;
  451.  
  452.     GoalTeamScore = 0; //LadderObj.CurrentLadder.Default.GoalTeamScore[IDnum];
  453.     Super.InitRatedGame(LadderObj, LadderPlayer);    
  454.     bCoopWeaponMode = true;
  455.     FriendlyFireScale = 0.0;
  456.     MaxTeams = 2;
  457.     ForEach AllActors(class'Weapon', W)
  458.         W.SetWeaponStay();
  459. }
  460.  
  461. //RiEvEr
  462. //@@ Watch out for this bit - need to change it
  463. //R
  464. function CheckReady()
  465. {
  466.     if ( (TimeLimit == 0) && (GoalTeamScore == 0) )
  467.     {
  468.         TimeLimit = 20;
  469.         RemainingTime = 60 * TimeLimit;
  470.     }
  471. }
  472. //RiEvEr
  473. // Added
  474. function Timer()
  475. {
  476.     local Pawn P;
  477.  
  478.     Super.Timer();
  479.     For ( P=Level.PawnList; P!=None; P=P.NextPawn )
  480.         if ( P.IsInState('FeigningDeath') )
  481.             P.GibbedBy(P);
  482. }
  483. //R
  484.  
  485. event PostLogin( playerpawn NewPlayer )
  486. {
  487.     //RiEvEr
  488.     if( NewPlayer.Player != None && Viewport(NewPlayer.Player) != None)
  489.         LocalPlayer = NewPlayer;
  490.  
  491.     if ( (TotalKills > 0.15 * (NumPlayers + NumBots) * Lives) && NewPlayer.IsA('CHSpectator') )
  492.         GameName = AltStartupMessage;    
  493.     Super.PostLogin(NewPlayer);
  494.     GameName = Default.GameName;
  495.     //R
  496.     if ( Level.NetMode != NM_Standalone )
  497.         NewPlayer.ClientChangeTeam(NewPlayer.PlayerReplicationInfo.Team);
  498. }
  499.  
  500. function LogGameParameters(StatLog StatLog)
  501. {
  502.     if (StatLog == None)
  503.         return;
  504.     
  505.     Super.LogGameParameters(StatLog);
  506.  
  507.     StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"GoalTeamScore"$Chr(9)$int(GoalTeamScore));
  508.     StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"FriendlyFireScale"$Chr(9)$FriendlyFireScale);
  509. }
  510.  
  511. //RiEvEr
  512. //@@ Check out the exact effects of this too!
  513. //R
  514. function bool SetEndCams(string Reason)
  515. {
  516.     local TeamInfo BestTeam;
  517.     local int i;
  518.     local pawn P, Best;
  519.     local PlayerPawn player;
  520.  
  521.     // find individual winner
  522.     for ( P=Level.PawnList; P!=None; P=P.nextPawn )
  523.         if ( P.bIsPlayer && ((Best == None) || (P.PlayerReplicationInfo.Score > Best.PlayerReplicationInfo.Score)) )
  524.             Best = P;
  525.  
  526.     // find winner
  527.     BestTeam = Teams[0];
  528.     for ( i=1; i<MaxTeams; i++ )
  529.         if ( Teams[i].Score > BestTeam.Score )
  530.             BestTeam = Teams[i];
  531.  
  532.     for ( i=0; i<MaxTeams; i++ )
  533.         if ( (BestTeam.TeamIndex != i) && (BestTeam.Score == Teams[i].Score) )
  534.         {
  535.             BroadcastLocalizedMessage( class'DeathMatchMessage', 0 );
  536.             return false;
  537.         }        
  538.  
  539.     GameReplicationInfo.GameEndedComments = TeamPrefix@BestTeam.TeamName@GameEndedMessage;
  540.  
  541.     EndTime = Level.TimeSeconds + 3.0;
  542.     for ( P=Level.PawnList; P!=None; P=P.nextPawn )
  543.     {
  544.         player = PlayerPawn(P);
  545.         if ( Player != None )
  546.         {
  547.             if (!bTutorialGame)
  548.                 PlayWinMessage(Player, (Player.PlayerReplicationInfo.Team == BestTeam.TeamIndex));
  549.             player.bBehindView = true;
  550.             if ( Player == Best )
  551.                 Player.ViewTarget = None;
  552.             else
  553.                 Player.ViewTarget = Best;
  554.             player.ClientGameEnded();
  555.         }
  556.         P.GotoState('GameEnded');
  557.     }
  558.     CalcEndStats();
  559.     return true;
  560. }
  561.  
  562. //------------------------------------------------------------------------------
  563. // Player start functions
  564.  
  565. function PlayStartUpMessage(PlayerPawn NewPlayer)
  566. {
  567.     local int i;
  568.     local color WhiteColor;
  569.  
  570.     NewPlayer.ClearProgressMessages();
  571.  
  572.     // GameName
  573.     NewPlayer.SetProgressMessage(GameName, i++);
  574.     if ( bRequireReady && (Level.NetMode != NM_Standalone) )
  575.         NewPlayer.SetProgressMessage(TourneyMessage, i++);
  576.     else
  577.         NewPlayer.SetProgressMessage(StartUpMessage, i++);
  578.  
  579.     if ( GoalTeamScore > 0 )
  580.         NewPlayer.SetProgressMessage(int(GoalTeamScore)@GameGoal, i++);
  581.  
  582.     if ( NewPlayer.PlayerReplicationInfo.Team < 4 )
  583.     {
  584.         NewPlayer.SetProgressColor(class'ChallengeTeamHUD'.Default.TeamColor[NewPlayer.PlayerReplicationInfo.Team], i);
  585.         NewPlayer.SetProgressMessage(StartupTeamMessage@Teams[NewPlayer.PlayerReplicationInfo.Team].TeamName$".", i++);
  586.         WhiteColor.R = 255;
  587.         WhiteColor.G = 255;
  588.         WhiteColor.B = 255;
  589.         NewPlayer.SetProgressColor(WhiteColor, i);
  590.         if ( !bRatedGame )
  591.             NewPlayer.SetProgressMessage(TeamChangeMessage, i++);
  592.     }
  593.  
  594.     if ( Level.NetMode == NM_Standalone )
  595.         NewPlayer.SetProgressMessage(SingleWaitingMessage, i++);
  596. }
  597.  
  598. function playerpawn Login
  599. (
  600.     string Portal,
  601.     string Options,
  602.     out string Error,
  603.     class<playerpawn> SpawnClass
  604. )
  605. {
  606.     local PlayerPawn newPlayer;
  607.     local NavigationPoint StartSpot;
  608.  
  609. //RiEvEr
  610.     // if more than 15% of the game is over, must join as spectator
  611.     if ( TotalKills > 0.15 * (NumPlayers + NumBots) * Lives )
  612.     {
  613.         SpawnClass = class'CHSpectator';
  614.         if ( (NumSpectators >= MaxSpectators)
  615.             && ((Level.NetMode != NM_ListenServer) || (NumPlayers > 0)) )
  616.         {
  617.             MaxSpectators++;
  618.         }
  619.     }
  620. //R
  621.     newPlayer = Super.Login(Portal, Options, Error, SpawnClass);
  622.     if ( newPlayer == None)
  623.         return None;
  624. //RiEvEr
  625.     if ( (NewPlayer != None) && !NewPlayer.IsA('Spectator') && !NewPlayer.IsA('Commander') )
  626.         NewPlayer.PlayerReplicationInfo.Score = Lives;
  627.     else
  628.         return newPlayer;
  629. //R
  630.     if ( bSpawnInTeamArea )
  631.     {
  632.         StartSpot = FindPlayerStart(NewPlayer,255, Portal);
  633.         if ( StartSpot != None )
  634.         {
  635.             NewPlayer.SetLocation(StartSpot.Location);
  636.             NewPlayer.SetRotation(StartSpot.Rotation);
  637.             NewPlayer.ViewRotation = StartSpot.Rotation;
  638.             NewPlayer.ClientSetRotation(NewPlayer.Rotation);
  639.             StartSpot.PlayTeleportEffect( NewPlayer, true );
  640.         }
  641.     }
  642.     PlayerTeamNum = NewPlayer.PlayerReplicationInfo.Team;
  643.  
  644. //RiEvEr
  645.     CalcTeamScores();
  646. //R
  647.     return newPlayer;
  648. }
  649.  
  650. function Logout(pawn Exiting)
  651. {
  652.     Super.Logout(Exiting);
  653.     if ( Exiting.IsA('Spectator') || Exiting.IsA('Commander') )
  654.         return;
  655.     Teams[Exiting.PlayerReplicationInfo.Team].Size--;
  656.     ClearOrders(Exiting);
  657.     if ( !bGameEnded && bBalanceTeams && !bRatedGame )
  658.         ReBalance();
  659. //RiEvEr
  660.     // Don't run endgame if it's the local player leaving
  661.     // - stats saveconfig messes up saved defaults
  662.     if( LocalPlayer == None || Exiting != LocalPlayer )
  663.         CheckEndGame();
  664. //R
  665. }
  666.  
  667. // Find a team given its name
  668. function byte FindTeamByName( string TeamName )
  669. {
  670.     local byte i;
  671.  
  672.     for ( i=0; i<MaxTeams; i++ )
  673.         if ( Teams[i].TeamName == TeamName )
  674.             return i;
  675.  
  676.     return 255; // No Team
  677. }
  678.  
  679. // rebalance teams after player changes teams or leaves
  680. // find biggest and smallest teams.  If 2 apart, move bot from biggest to smallest
  681.  
  682. function ReBalance()
  683. {
  684.     local int big, small, i, bigsize, smallsize;
  685.     local Pawn P, A;
  686.     local Bot B;
  687.  
  688.     if ( bBalancing || (NumBots == 0) )
  689.         return;
  690. //RiEvEr
  691.     // if more than 15% of the game is over, don't balance.
  692.     if ( TotalKills > 0.15 * (NumPlayers + NumBots) * Lives )
  693.         return;
  694. //R
  695.     big = 0;
  696.     small = 0;
  697.     bigsize = Teams[0].Size;
  698.     smallsize = Teams[0].Size;
  699.     for ( i=1; i<MaxTeams; i++ )
  700.     {
  701.         if ( Teams[i].Size > bigsize )
  702.         {
  703.             big = i;
  704.             bigsize = Teams[i].Size;
  705.         }
  706.         else if ( Teams[i].Size < smallsize )
  707.         {
  708.             small = i;
  709.             smallsize = Teams[i].Size;
  710.         }
  711.     }
  712.     
  713.     bBalancing = true;
  714.     while ( bigsize - smallsize > 1 )
  715.     {
  716.         for ( P=Level.PawnList; P!=None; P=P.NextPawn )
  717.             if ( P.bIsPlayer && (P.PlayerReplicationInfo.Team == big)
  718.                 && P.IsA('Bot') )
  719.             {
  720.                 B = Bot(P);
  721.                 break;
  722.             }
  723.         if ( B != None )
  724.         {
  725.             B.Health = 0;
  726.             B.Died( None, 'Suicided', B.Location );
  727.             bigsize--;
  728.             smallsize++;
  729.             ChangeTeam(B, small);
  730.         }
  731.         else
  732.             Break;
  733.     }
  734.     bBalancing = false;
  735.  
  736.     // re-assign orders to follower bots with no leaders
  737.     for ( P=Level.PawnList; P!=None; P=P.NextPawn )
  738.         if ( P.bIsPlayer && P.IsA('Bot') && (BotReplicationInfo(P.PlayerReplicationInfo).RealOrders == 'Follow') )
  739.         {
  740.             A = Pawn(Bot(P).OrderObject);
  741.             if ( (A == None) || A.bDeleteMe || !A.bIsPlayer || (A.PlayerReplicationInfo.Team != P.PlayerReplicationInfo.Team) )
  742.             {
  743.                 Bot(P).OrderObject = None;
  744.                 SetBotOrders(Bot(P));
  745.             }
  746.         }
  747.  
  748. }
  749.     
  750. function NavigationPoint FindPlayerStart( Pawn Player, optional byte InTeam, optional string incomingName )
  751. {
  752.     local PlayerStart Dest, Candidate[16], Best;
  753.     local float Score[16], BestScore, NextDist;
  754.     local pawn OtherPlayer;
  755.     local int i, num;
  756.     local Teleporter Tel;
  757.     local NavigationPoint N;
  758.     local byte Team;
  759.  
  760.     if ( bStartMatch && (Player != None) && Player.IsA('TournamentPlayer') 
  761.         && (Level.NetMode == NM_Standalone)
  762.         && (TournamentPlayer(Player).StartSpot != None) )
  763.         return TournamentPlayer(Player).StartSpot;
  764.  
  765.     if ( (Player != None) && (Player.PlayerReplicationInfo != None) )
  766.         Team = Player.PlayerReplicationInfo.Team;
  767.     else
  768.         Team = InTeam;
  769.  
  770.     if( incomingName!="" )
  771.         foreach AllActors( class 'Teleporter', Tel )
  772.             if( string(Tel.Tag)~=incomingName )
  773.                 return Tel;
  774.  
  775.     if ( Team == 255 )
  776.         Team = 0;
  777.                 
  778.     //choose candidates    
  779.     for ( N=Level.NavigationPointList; N!=None; N=N.nextNavigationPoint )
  780.     {
  781.         Dest = PlayerStart(N);
  782.         if ( (Dest != None) && Dest.bEnabled
  783.             && (!bSpawnInTeamArea || (Team == Dest.TeamNumber)) )
  784.         {
  785.             if (num<16)
  786.                 Candidate[num] = Dest;
  787.             else if (Rand(num) < 16)
  788.                 Candidate[Rand(16)] = Dest;
  789.             num++;
  790.         }
  791.     }
  792.  
  793.     if (num == 0 )
  794.     {
  795.         log("Didn't find any player starts in list for team"@Team@"!!!"); 
  796.         foreach AllActors( class'PlayerStart', Dest )
  797.         {
  798.             if (num<16)
  799.                 Candidate[num] = Dest;
  800.             else if (Rand(num) < 16)
  801.                 Candidate[Rand(16)] = Dest;
  802.             num++;
  803.         }
  804.         if ( num == 0 )
  805.             return None;
  806.     }
  807.  
  808.     if (num>16) 
  809.         num = 16;
  810.     
  811.     //assess candidates
  812.     for (i=0;i<num;i++)
  813.     {
  814.         if ( Candidate[i] == LastStartSpot )
  815.             Score[i] = -6000.0;
  816.         else
  817.             Score[i] = 4000 * FRand(); //randomize
  818.     }        
  819.     
  820.     for ( OtherPlayer=Level.PawnList; OtherPlayer!=None; OtherPlayer=OtherPlayer.NextPawn)    
  821.         if ( OtherPlayer.bIsPlayer && (OtherPlayer.Health > 0) && !OtherPlayer.IsA('Spectator') )
  822.             for (i=0; i<num; i++)
  823.                 if ( OtherPlayer.Region.Zone == Candidate[i].Region.Zone ) 
  824.                 {
  825.                     Score[i] -= 1500;
  826.                     NextDist = VSize(OtherPlayer.Location - Candidate[i].Location);
  827.                     if (NextDist < 2 * (CollisionRadius + CollisionHeight))
  828.                         Score[i] -= 1000000.0;
  829.                     else if ( (NextDist < 2000) && (OtherPlayer.PlayerReplicationInfo.Team != Team)
  830.                             && FastTrace(Candidate[i].Location, OtherPlayer.Location) )
  831.                         Score[i] -= (10000.0 - NextDist);
  832.                 }
  833.     
  834.     BestScore = Score[0];
  835.     Best = Candidate[0];
  836.     for (i=1; i<num; i++)
  837.         if (Score[i] > BestScore)
  838.         {
  839.             BestScore = Score[i];
  840.             Best = Candidate[i];
  841.         }
  842.     LastStartSpot = Best;
  843.                 
  844.     return Best;
  845. }
  846.  
  847. //-------------------------------------------------------------------------------------
  848. // Level gameplay modification
  849.  
  850. //Use reduce damage for teamplay modifications, etc.
  851. function int ReduceDamage(int Damage, name DamageType, pawn injured, pawn instigatedBy)
  852. {
  853.     Damage = Super.ReduceDamage(Damage, DamageType, injured, instigatedBy);
  854.     
  855.     if ( instigatedBy == None )
  856.         return Damage;
  857.  
  858.     if ( (instigatedBy != injured) && injured.bIsPlayer && instigatedBy.bIsPlayer 
  859.         && (injured.PlayerReplicationInfo.Team == instigatedBy.PlayerReplicationInfo.Team) )
  860.     {
  861.         if ( injured.IsA('Bot') )
  862.             Bot(Injured).YellAt(instigatedBy);
  863.         return (Damage * FriendlyFireScale);
  864.     }
  865.     else
  866.         return Damage;
  867. }
  868.  
  869. //RiEvEr
  870. // Added
  871. function Killed( pawn killer, pawn Other, name damageType )
  872. {
  873.     local int OldFragLimit;
  874.  
  875.     OldFragLimit = FragLimit;
  876.     FragLimit = 0;
  877.  
  878.     if ( Other.bIsPlayer )
  879.         TotalKills++;
  880.             
  881.     Super.Killed(Killer, Other, damageType);
  882.     
  883.     Log("Inside Killed Function");    
  884.  
  885.     FragLimit = OldFragLimit;
  886.  
  887.     CheckEndGame();
  888. }
  889. //R
  890.  
  891. //RiEvEr
  892. // Replaced
  893. function ScoreKill(pawn Killer, pawn Other)
  894. {
  895.     Other.DieCount++;
  896.     if (Other.PlayerReplicationInfo.Score > 0)
  897.     {
  898.         Other.PlayerReplicationInfo.Score -= 1;
  899.         if ( Other.IsA('PlayerPawn')  && (Other.PlayerReplicationInfo.Score < 1) )
  900.         {
  901.             // Stop bots "supporting" ghosts
  902.             ClearOrders( Other );
  903.         }
  904.     }
  905.     if( (killer != Other) && (killer != None) )
  906.         killer.killCount++;
  907.     BaseMutator.ScoreKill(Killer, Other);
  908.  
  909.     CalcTeamScores();
  910. }    
  911.  
  912. /*
  913. function ScoreKill(pawn Killer, pawn Other)
  914. {
  915.     if ( (Killer == None) || (Killer == Other) || !Other.bIsPlayer || !Killer.bIsPlayer 
  916.         || (Killer.PlayerReplicationInfo.Team != Other.PlayerReplicationInfo.Team) )
  917.         Super.ScoreKill(Killer, Other);
  918.  
  919.     if ( !bScoreTeamKills )
  920.         return;
  921.     if ( Other.bIsPlayer && ((Killer == None) || Killer.bIsPlayer) )
  922.     {
  923.         if ( (Killer == Other) || (Killer == None) )
  924.             Teams[Other.PlayerReplicationInfo.Team].Score -= 1;
  925.         else if ( Killer.PlayerReplicationInfo.Team != Other.PlayerReplicationInfo.Team )
  926.             Teams[Killer.PlayerReplicationInfo.Team].Score += 1;
  927.         else if ( FriendlyFireScale > 0 )
  928.         {
  929.             Teams[Other.PlayerReplicationInfo.Team].Score -= 1;
  930.             Killer.PlayerReplicationInfo.Score -= 1;
  931.         }
  932.     }
  933.  
  934.     if ( (bOverTime || (GoalTeamScore > 0)) && Killer.bIsPlayer
  935.         && (Teams[killer.PlayerReplicationInfo.Team].Score >= GoalTeamScore) )
  936.         EndGame("teamscorelimit");
  937. }*/
  938. //R
  939.  
  940. function bool ChangeTeam(Pawn Other, int NewTeam)
  941. {
  942.     local int i, s, DesiredTeam;
  943.     local pawn APlayer, P;
  944.     local teaminfo SmallestTeam;
  945.  
  946.     if ( bRatedGame && (Other.PlayerReplicationInfo.Team != 255) )
  947.         return false;
  948.  
  949. //RiEvEr
  950.     // if more than 15% of the game is over, no team changes.
  951.     if ( TotalKills > 0.15 * (NumPlayers + NumBots) * Lives )
  952.         return false;
  953. //R
  954.  
  955.     for( i=0; i<MaxTeams; i++ )
  956.         if ( (SmallestTeam == None) 
  957.             || (SmallestTeam.Size > Teams[i].Size) )
  958.         {
  959.             s = i;
  960.             SmallestTeam = Teams[i];
  961.         }
  962.  
  963.     if ( bPlayersBalanceTeams && (Level.NetMode != NM_Standalone) )
  964.     {
  965.         if ( NumBots == 1 )
  966.         {
  967.             // join bot's team, because he will leave
  968.             for ( P=Level.PawnList; P!=None; P=P.NextPawn )
  969.                 if ( P.IsA('Bot') )
  970.                     break;
  971.             
  972.             if ( (P != None) && (P.PlayerReplicationInfo != None)
  973.                 && (Teams[P.PlayerReplicationInfo.Team].Size == SmallestTeam.Size) )
  974.             {                    
  975.                 Other.PlayerReplicationInfo.Team = 255;
  976.                 NewTeam = P.PlayerReplicationInfo.Team;
  977.             }
  978.             else if ( (NewTeam >= MaxTeams) 
  979.                 || (Teams[NewTeam].Size > SmallestTeam.Size) )
  980.             {    
  981.                 Other.PlayerReplicationInfo.Team = 255;
  982.                 NewTeam = 255;
  983.             }
  984.         }
  985.         else if ( (NewTeam >= MaxTeams) 
  986.             || (Teams[NewTeam].Size > SmallestTeam.Size) )
  987.         {    
  988.             Other.PlayerReplicationInfo.Team = 255;
  989.             NewTeam = 255;
  990.         }
  991.     }
  992.  
  993.     if ( (NewTeam == 255) || (NewTeam >= MaxTeams) )
  994.         NewTeam = s;
  995.  
  996.     if ( Other.IsA('Spectator') )
  997.     {
  998.         Other.PlayerReplicationInfo.Team = 255;
  999.         if (LocalLog != None)
  1000.             LocalLog.LogTeamChange(Other);
  1001.         if (WorldLog != None)
  1002.             WorldLog.LogTeamChange(Other);
  1003.         //RiEvEr
  1004.         CalcTeamScores();
  1005.         //R
  1006.         return true;
  1007.     }
  1008.     if ( Other.IsA('Commander') )
  1009.     {
  1010.         Other.PlayerReplicationInfo.Team = NewTeam;
  1011.         if (LocalLog != None)
  1012.             LocalLog.LogTeamChange(Other);
  1013.         if (WorldLog != None)
  1014.             WorldLog.LogTeamChange(Other);
  1015.         //RiEvEr
  1016.         CalcTeamScores();
  1017.         //R
  1018.         return true;
  1019.     }
  1020.     if ( (Other.PlayerReplicationInfo.Team == NewTeam) && bNoTeamChanges )
  1021.         return false;
  1022.  
  1023.     if ( Other.IsA('TournamentPlayer') )
  1024.         TournamentPlayer(Other).StartSpot = None;
  1025.  
  1026.     if ( Other.PlayerReplicationInfo.Team != 255 )
  1027.     {
  1028.         ClearOrders(Other);
  1029.         Teams[Other.PlayerReplicationInfo.Team].Size--;
  1030.     }
  1031.  
  1032.     if (Teams[NewTeam].Size < MaxTeamSize)
  1033.     {
  1034.         AddToTeam(NewTeam, Other);
  1035.         return true;
  1036.     }
  1037.  
  1038.     if ( (SmallestTeam != None) && (SmallestTeam.Size < MaxTeamSize) )
  1039.     {
  1040.         AddToTeam(s, Other);
  1041.         return true;
  1042.     }
  1043.  
  1044.     return false;
  1045. }
  1046.  
  1047. function AddToTeam( int num, Pawn Other )
  1048. {
  1049.     local teaminfo aTeam;
  1050.     local Pawn P;
  1051.     local bool bSuccess;
  1052.     local string SkinName, FaceName;
  1053.  
  1054.     if ( Other == None )
  1055.     {
  1056.         log("Added none to team!!!");
  1057.         return;
  1058.     }
  1059.  
  1060.     aTeam = Teams[num];
  1061.  
  1062.     aTeam.Size++;
  1063.     Other.PlayerReplicationInfo.Team = num;
  1064.     Other.PlayerReplicationInfo.TeamName = aTeam.TeamName;
  1065.     if (LocalLog != None)
  1066.         LocalLog.LogTeamChange(Other);
  1067.     if (WorldLog != None)
  1068.         WorldLog.LogTeamChange(Other);
  1069.     bSuccess = false;
  1070.     if ( Other.IsA('PlayerPawn') )
  1071.     {
  1072.         Other.PlayerReplicationInfo.TeamID = 0;
  1073.         PlayerPawn(Other).ClientChangeTeam(Other.PlayerReplicationInfo.Team);
  1074.     }
  1075.     else
  1076.         Other.PlayerReplicationInfo.TeamID = 1;
  1077.  
  1078.     while ( !bSuccess )
  1079.     {
  1080.         bSuccess = true;
  1081.         for ( P=Level.PawnList; P!=None; P=P.nextPawn )
  1082.             if ( P.bIsPlayer && (P != Other) 
  1083.                 && (P.PlayerReplicationInfo.Team == Other.PlayerReplicationInfo.Team) 
  1084.                 && (P.PlayerReplicationInfo.TeamId == Other.PlayerReplicationInfo.TeamId) )
  1085.                 bSuccess = false;
  1086.         if ( !bSuccess )
  1087.             Other.PlayerReplicationInfo.TeamID++;
  1088.     }
  1089.  
  1090.     BroadcastLocalizedMessage( class'DeathMatchMessage', 3, Other.PlayerReplicationInfo, None, aTeam );
  1091.  
  1092.     Other.static.GetMultiSkin(Other, SkinName, FaceName);
  1093.     Other.static.SetMultiSkin(Other, SkinName, FaceName, num);
  1094.  
  1095.     if ( bBalanceTeams && !bRatedGame )
  1096.         ReBalance();
  1097.     //RiEvEr
  1098.     CalcTeamScores();
  1099.     //R
  1100. }
  1101.  
  1102. function bool CanSpectate( pawn Viewer, actor ViewTarget )
  1103. {
  1104.     if ( ViewTarget.bIsPawn && (Pawn(ViewTarget).PlayerReplicationInfo != None)
  1105.         && Pawn(ViewTarget).PlayerReplicationInfo.bIsSpectator )
  1106.         return false;
  1107.     if ( Viewer.PlayerReplicationInfo.bIsSpectator && (Viewer.PlayerReplicationInfo.Team == 255) )
  1108.         return true;
  1109.     return ( (Pawn(ViewTarget) != None) && Pawn(ViewTarget).bIsPlayer 
  1110.         && (Pawn(ViewTarget).PlayerReplicationInfo.Team == Viewer.PlayerReplicationInfo.Team) );
  1111. }
  1112.  
  1113. function TeamInfo GetTeam(int TeamNum )
  1114. {
  1115.     if ( TeamNum < ArrayCount(Teams) )
  1116.         return Teams[TeamNum];
  1117.     else return None;
  1118. }
  1119.  
  1120. function bool IsOnTeam(Pawn Other, int TeamNum)
  1121. {
  1122.     if ( Other.PlayerReplicationInfo.Team == TeamNum )
  1123.         return true;
  1124.  
  1125.     return false;
  1126. }
  1127.  
  1128. function bool AddBot()
  1129. {
  1130.     local bot NewBot;
  1131.     local NavigationPoint StartSpot, OldStartSpot;
  1132.     local int DesiredTeam, i, MinSize;
  1133.  
  1134.     NewBot = SpawnBot(StartSpot);
  1135.     if ( NewBot == None )
  1136.     {
  1137.         log("Failed to spawn bot");
  1138.         return false;
  1139.     }
  1140.  
  1141.     if ( bBalanceTeams && !bRatedGame )
  1142.     {
  1143.         MinSize = Teams[0].Size;
  1144.         DesiredTeam = 0;
  1145.         for ( i=1; i<MaxTeams; i++ )
  1146.             if ( Teams[i].Size < MinSize )
  1147.             {
  1148.                 MinSize = Teams[i].Size;
  1149.                 DesiredTeam = i;
  1150.             }    
  1151.     }
  1152.     else
  1153.         DesiredTeam = NewBot.PlayerReplicationInfo.Team;
  1154.     NewBot.PlayerReplicationInfo.Team = 255;
  1155.     if ( (DesiredTeam == 255) || !ChangeTeam(NewBot, DesiredTeam) )
  1156.     {
  1157.         ChangeTeam(NewBot, NextBotTeam);
  1158.         NextBotTeam++;
  1159.         if ( NextBotTeam >= MaxTeams )
  1160.             NextBotTeam = 0;
  1161.     }
  1162.  
  1163.     if ( bSpawnInTeamArea )
  1164.     {
  1165.         OldStartSpot = StartSpot;
  1166.         StartSpot = FindPlayerStart(NewBot,255);
  1167.         if ( StartSpot != None )
  1168.         {
  1169.             NewBot.SetLocation(StartSpot.Location);
  1170.             NewBot.SetRotation(StartSpot.Rotation);
  1171.             NewBot.ViewRotation = StartSpot.Rotation;
  1172.             NewBot.SetRotation(NewBot.Rotation);
  1173.             StartSpot.PlayTeleportEffect( NewBot, true );
  1174.         }
  1175.         else
  1176.             StartSpot = OldStartSpot;
  1177.     }
  1178.  
  1179.     StartSpot.PlayTeleportEffect(NewBot, true);
  1180.  
  1181.     SetBotOrders(NewBot);
  1182.  
  1183.     // Log it.
  1184.     if (LocalLog != None)
  1185.     {
  1186.         LocalLog.LogPlayerConnect(NewBot);
  1187.         LocalLog.FlushLog();
  1188.     }
  1189.     if (WorldLog != None)
  1190.     {
  1191.         WorldLog.LogPlayerConnect(NewBot);
  1192.         WorldLog.FlushLog();
  1193.     }
  1194.  
  1195.     //RiEvEr
  1196.     CalcTeamScores();
  1197.     //R
  1198.     return true;
  1199. }
  1200.  
  1201. function SetBotOrders(Bot NewBot)
  1202. {
  1203.     local Pawn P, L;
  1204.     local int num, total;
  1205.  
  1206.     // only follow players, if there are any
  1207.     if ( (NumSupportingPlayer == 0)
  1208.          || (NumSupportingPlayer < Teams[NewBot.PlayerReplicationInfo.Team].Size/2 - 1) ) 
  1209.     {
  1210.         For ( P=Level.PawnList; P!=None; P= P.NextPawn )
  1211.             if ( P.IsA('PlayerPawn') && (P.PlayerReplicationInfo.Team == NewBot.PlayerReplicationInfo.Team)
  1212.                 && !P.IsA('Spectator') && (P.PlayerReplicationInfo.Score > 0) ) // RiEvEr
  1213.         {
  1214.             num++;
  1215.             if ( (L == None) || (FRand() < 1.0/float(num)) )
  1216.                 L = P;
  1217.         }
  1218.  
  1219.         if ( L != None )
  1220.         {
  1221.             NumSupportingPlayer++;
  1222.             NewBot.SetOrders('Follow',L,true);
  1223.             return;
  1224.         }
  1225.     }
  1226.     num = 0;
  1227.     For ( P=Level.PawnList; P!=None; P= P.NextPawn )
  1228.         if ( P.bIsPlayer && (P.PlayerReplicationInfo.Team == NewBot.PlayerReplicationInfo.Team) 
  1229.          && (P.PlayerReplicationInfo.Score > 0) ) // RiEvEr
  1230.         {
  1231.             total++;
  1232.             if ( (P != NewBot) && P.IsA('Bot') && (Bot(P).Orders == 'FreeLance') )
  1233.             {
  1234.                 num++;
  1235.                 if ( (L == None) || (FRand() < 1/float(num)) )
  1236.                     L = P;
  1237.             }
  1238.         }
  1239.                 
  1240.     if ( (L != None) && (FRand() < float(num)/float(total)) )
  1241.     {
  1242.         NewBot.SetOrders('Follow',L,true);
  1243.         return;
  1244.     }
  1245.     NewBot.SetOrders('Freelance', None,true);
  1246. }                 
  1247.  
  1248. function byte AssessBotAttitude(Bot aBot, Pawn Other)
  1249. {
  1250. //RiEvEr
  1251.     local float Adjust;
  1252.  
  1253.     if ( aBot.bNovice )
  1254.         Adjust = -0.2;
  1255.     else
  1256.         Adjust = -0.2 - 0.1 * aBot.Skill;
  1257.  
  1258.     if ( Other.bIsPlayer && (Other.PlayerReplicationInfo.Score < 1) )
  1259.         return 2; //bots ignore ghosts
  1260.     else if ( (Other.bIsPlayer && (aBot.PlayerReplicationInfo.Team == Other.PlayerReplicationInfo.Team))
  1261.         || (Other.IsA('TeamCannon') 
  1262.             && (StationaryPawn(Other).SameTeamAs(aBot.PlayerReplicationInfo.Team))) ) 
  1263.         return 3;
  1264.     else if ( aBot.bKamikaze )
  1265.         return 1;
  1266.     else if ( Other.IsA('TeamCannon')
  1267.         || (aBot.RelativeStrength(Other) > aBot.Aggressiveness - Adjust) )
  1268.         return 0;
  1269.     else
  1270.         return 1;
  1271. //R
  1272. }
  1273.  
  1274. function Actor SetDefenseFor(Bot aBot)
  1275. {
  1276.     return None;
  1277. }
  1278.  
  1279. function bool FindSpecialAttractionFor(Bot aBot)
  1280. {
  1281.     return false;
  1282. }
  1283.  
  1284. function SetAttractionStateFor(Bot aBot)
  1285. {
  1286.     if ( aBot.Enemy != None )
  1287.     {
  1288.         if ( !aBot.IsInState('FallBack') )
  1289.         {
  1290.             aBot.bNoClearSpecial = true;
  1291.             aBot.TweenToRunning(0.1);
  1292.             aBot.GotoState('FallBack','SpecialNavig');
  1293.         }
  1294.     }
  1295.     else if ( !aBot.IsInState('Roaming') )
  1296.     {
  1297.         aBot.bNoClearSpecial = true;
  1298.         aBot.TweenToRunning(0.1);
  1299.         aBot.GotoState('Roaming', 'SpecialNavig');
  1300.     }
  1301. }
  1302.  
  1303. function PickAmbushSpotFor(Bot aBot)
  1304. {
  1305.     local NavigationPoint N;
  1306.  
  1307.     for ( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint )
  1308.         if ( N.IsA('Ambushpoint') && !N.taken )
  1309.         {
  1310.             if ( aBot.Orders == 'Defend' )
  1311.             {
  1312.                 if ( N.IsA('DefensePoint') && (DefensePoint(N).team == aBot.PlayerReplicationInfo.team) )
  1313.                 {
  1314.                     if ( (DefensePoint(aBot.Ambushspot) == None)
  1315.                         || (DefensePoint(N).priority > DefensePoint(aBot.Ambushspot).priority) )
  1316.                         aBot.Ambushspot = Ambushpoint(N);
  1317.                     else if ( (DefensePoint(N).priority == DefensePoint(aBot.Ambushspot).priority)
  1318.                         && (FRand() < 0.4) ) 
  1319.                         aBot.Ambushspot = Ambushpoint(N);
  1320.                 }        
  1321.                 else if ( (DefensePoint(aBot.AmbushSpot) == None)
  1322.                         && (VSize(N.Location - aBot.OrderObject.Location) < 1500)
  1323.                         && FastTrace(aBot.OrderObject.Location, N.Location)
  1324.                         && ((aBot.Ambushspot == None) || (FRand() < 0.5)) )
  1325.                             aBot.Ambushspot = Ambushpoint(N);
  1326.             }
  1327.             else if ( (aBot.AmbushSpot == None)
  1328.                 || (VSize(aBot.Location - aBot.Ambushspot.Location)
  1329.                      > VSize(aBot.Location - N.Location)) )
  1330.                 aBot.Ambushspot = Ambushpoint(N);
  1331.         }
  1332. }
  1333.  
  1334. function byte PriorityObjective(Bot aBot)
  1335. {
  1336.     return 0;
  1337. }
  1338.  
  1339. function bool SuccessfulGame()
  1340. {
  1341.     local TeamInfo BestTeam;
  1342.     local int i;
  1343.     BestTeam = Teams[0];
  1344.     for ( i=1; i<MaxTeams; i++ )
  1345.         if ( Teams[i].Score > BestTeam.Score )
  1346.             BestTeam = Teams[i];
  1347.  
  1348.     bFulfilledSpecial = True; // Override and implement if you have a special condition.
  1349.     if (BestTeam.TeamIndex == RatedPlayer.PlayerReplicationInfo.Team)
  1350.         return true;    //RiEvEr ( bFulfilledSpecial && (BestTeam.Score >= GoalTeamScore) );
  1351.     else
  1352.         return false;
  1353. }
  1354.  
  1355. function ClearOrders(Pawn Leaving)
  1356. {
  1357.     local Pawn P;
  1358.  
  1359.     for ( P=Level.PawnList; P!=None; P=P.NextPawn )
  1360.         if ( P.IsA('Bot') && (Bot(P).OrderObject == Leaving) )
  1361.             Bot(P).SetOrders('Freelance', None);
  1362. }
  1363. function bool WaitForPoint(bot aBot)
  1364. {
  1365.     return false;
  1366. }
  1367.  
  1368. function bool SendBotToGoal(Bot aBot)
  1369. {
  1370.     return false;
  1371. }
  1372.  
  1373. function bool HandleTieUp(Bot Bumper, Bot Bumpee)
  1374. {
  1375.     return false;
  1376. }
  1377.  
  1378. //------------------------------------------------------------------------------
  1379. // Game Querying.
  1380.  
  1381. function string GetRules()
  1382. {
  1383.     local string ResultSet;
  1384.     ResultSet = Super(TournamentGameInfo).GetRules();
  1385.  
  1386.     // Timelimit.
  1387.     ResultSet = ResultSet$"\\timelimit\\"$TimeLimit;
  1388.         
  1389.     // Fraglimit
  1390. //    ResultSet = ResultSet$"\\goalteamscore\\"$int(GoalTeamScore);
  1391.         
  1392.     // MinPlayers
  1393.     Resultset = ResultSet$"\\minplayers\\"$MinPlayers;
  1394.  
  1395.     // Change Levels
  1396.     Resultset = ResultSet$"\\changelevels\\"$bChangeLevels;
  1397.  
  1398.     // Max Teams
  1399.     ResultSet = ResultSet$"\\maxteams\\"$MaxTeams;
  1400.  
  1401.     // Balance Teams
  1402.     ResultSet = ResultSet$"\\balanceteams\\"$bBalanceTeams;
  1403.  
  1404.     // Players Balance Teams
  1405.     ResultSet = ResultSet$"\\playersbalanceteams\\"$bPlayersBalanceTeams;
  1406.  
  1407.     // FriendlyFire
  1408.     ResultSet = ResultSet$"\\friendlyfire\\"$int(FriendlyFireScale*100)$"%";
  1409.     
  1410.     return ResultSet;
  1411. }
  1412. //==================================
  1413. //RiEvEr
  1414. // More LMS functions
  1415. //==================================
  1416. function bool RestartPlayer( pawn aPlayer )    
  1417. {
  1418.     local NavigationPoint startSpot;
  1419.     local bool foundStart;
  1420.     local Pawn P;
  1421.  
  1422.     if( bRestartLevel && Level.NetMode!=NM_DedicatedServer && Level.NetMode!=NM_ListenServer )
  1423.         return true;
  1424.  
  1425.     if ( aPlayer.PlayerReplicationInfo.Score < 1 )
  1426.     {
  1427.         BroadcastLocalizedMessage(class'LMSOutMessage', 0, aPlayer.PlayerReplicationInfo);
  1428.         For ( P=Level.PawnList; P!=None; P=P.NextPawn )
  1429.             if ( P.bIsPlayer && (P.PlayerReplicationInfo.Score >= 1) )
  1430.                 P.PlayerReplicationInfo.Score += 0.00001;
  1431.         if ( aPlayer.IsA('Bot') )
  1432.         {
  1433.             aPlayer.PlayerReplicationInfo.bIsSpectator = true;
  1434.             aPlayer.PlayerReplicationInfo.bWaitingPlayer = true;
  1435.             aPlayer.GotoState('GameEnded');
  1436.             return false; // bots don't respawn when ghosts
  1437.         }
  1438.     }
  1439.  
  1440. //    startSpot = FindPlayerStart(None, 255);
  1441.     startSpot = FindPlayerStart(aPlayer, 255);
  1442.     if( startSpot == None )
  1443.         return false;
  1444.         
  1445.     foundStart = aPlayer.SetLocation(startSpot.Location);
  1446.     if( foundStart )
  1447.     {
  1448.         startSpot.PlayTeleportEffect(aPlayer, true);
  1449.         aPlayer.SetRotation(startSpot.Rotation);
  1450.         aPlayer.ViewRotation = aPlayer.Rotation;
  1451.         aPlayer.Acceleration = vect(0,0,0);
  1452.         aPlayer.Velocity = vect(0,0,0);
  1453.         aPlayer.Health = aPlayer.Default.Health;
  1454.         aPlayer.ClientSetRotation( startSpot.Rotation );
  1455.         aPlayer.bHidden = false;
  1456.         aPlayer.SoundDampening = aPlayer.Default.SoundDampening;
  1457.         if ( aPlayer.PlayerReplicationInfo.Score < 1 )
  1458.         {
  1459.             // This guy is a ghost.  Add a visual effect.
  1460.             if ( bHighDetailGhosts )
  1461.             {
  1462.                 aPlayer.Style = STY_Translucent;
  1463.                 aPlayer.ScaleGlow = 0.5;
  1464.             } 
  1465.             else 
  1466.                 aPlayer.bHidden = true;
  1467.             aPlayer.PlayerRestartState = 'PlayerSpectating';
  1468.         } 
  1469.         else
  1470.         {
  1471.             aPlayer.SetCollision( true, true, true );
  1472.             AddDefaultInventory(aPlayer);
  1473.         }
  1474.     }
  1475.     return foundStart;
  1476. }
  1477.  
  1478. function bool NeedPlayers()
  1479. {
  1480.     if ( bGameEnded || (TotalKills > 0.15 * (NumPlayers + NumBots) * Lives) )
  1481.         return false;
  1482.     return (NumPlayers + NumBots < MinPlayers);
  1483. }
  1484.  
  1485. function bool IsRelevant(actor Other) 
  1486. {
  1487.     local Mutator M;
  1488.     local bool bArenaMutator;
  1489.  
  1490.     for (M = BaseMutator; M != None; M = M.NextMutator)
  1491.     {
  1492.         if (M.IsA('Arena'))
  1493.             bArenaMutator = True;
  1494.     }
  1495.  
  1496.     if ( bArenaMutator )
  1497.     {
  1498.         if ( Other.IsA('Inventory')    && (Inventory(Other).MyMarker != None) && !Other.IsA('UT_Jumpboots') && !Other.IsA('Ammo'))
  1499.         {
  1500.             Inventory(Other).MyMarker.markedItem = None;
  1501.             return false;
  1502.         }
  1503.     } else {
  1504.         if ( Other.IsA('Inventory')    && (Inventory(Other).MyMarker != None) && !Other.IsA('UT_Jumpboots'))
  1505.         {
  1506.             Inventory(Other).MyMarker.markedItem = None;
  1507.             return false;
  1508.         }
  1509.     }
  1510.  
  1511.     return Super.IsRelevant(Other);
  1512. }
  1513.  
  1514. // This function recalculates the team scores
  1515. function    CalcTeamScores()
  1516. {
  1517.     local Pawn PawnLink;
  1518.     local    int    i;
  1519.  
  1520.     // Clear the scores
  1521.     for( i=0; i<4; i++)
  1522.     {
  1523.         Teams[i].Score = 0;
  1524.     }
  1525.  
  1526.     // Now add up the current team scores
  1527.     for ( PawnLink=Level.PawnList; PawnLink!=None; PawnLink=PawnLink.nextPawn )
  1528.     {
  1529.         if ( PawnLink.bIsPlayer && PawnLink.PlayerReplicationInfo.Team != 255)
  1530.         {
  1531.             Teams[PawnLink.PlayerReplicationInfo.Team].Score += PawnLink.PlayerReplicationInfo.Score;
  1532.         }
  1533.     }
  1534. }
  1535.  
  1536. function CheckEndGame()
  1537. {
  1538.     local Pawn PawnLink, PawnLinkD;
  1539.     local int StillPlaying;
  1540.     local bool bStillHuman;
  1541.     local bot B, D;
  1542.     local int    TeamFound;
  1543.  
  1544.     if ( bGameEnded )
  1545.         return;
  1546.  
  1547.     TeamFound = 255;
  1548.     StillPlaying = 0;
  1549.     NumGhosts = 0;
  1550.     bStillHuman = False;
  1551.  
  1552.     for ( PawnLink=Level.PawnList; PawnLink!=None; PawnLink=PawnLink.nextPawn )
  1553.         if ( PawnLink.bIsPlayer )
  1554.         {
  1555.             if ( PawnLink.PlayerReplicationInfo.Score < 1 )
  1556.                 NumGhosts++;
  1557.             else
  1558.             {
  1559.                 if ( PawnLink.IsA('PlayerPawn') )
  1560.                     bStillHuman = true;
  1561.                 // Store first team number found if we don't have it yet
  1562.                 if( TeamFound == 255)
  1563.                     TeamFound = PawnLink.PlayerReplicationInfo.Team;
  1564.                 // Else, if it doesn't match then we have a second team
  1565.                 else if( TeamFound != PawnLink.PlayerReplicationInfo.Team)
  1566.                     StillPlaying++;
  1567.             }
  1568.         }
  1569.  
  1570.     // End the game if there is only one team standing.
  1571.     if ( StillPlaying < 1 )
  1572.     {
  1573.         Log("CheckEndGame: One Team Left");
  1574.         EndGame("teamscorelimit");
  1575.     }
  1576.     else if ( !bStillHuman )
  1577.     {
  1578.         //@@ Fix this up to use teams?
  1579.         // no humans left - get bots to be more aggressive and finish up
  1580.         for ( PawnLink=Level.PawnList; PawnLink!=None; PawnLink=PawnLink.NextPawn )
  1581.         {
  1582.             // Do not process eliminated bots
  1583.             if ( PawnLink.PlayerReplicationInfo.Score < 1 )
  1584.                 continue;
  1585.  
  1586.             B = Bot(PawnLink);
  1587.             if ( B != None )
  1588.             {
  1589.                 B.CampingRate = 0;
  1590.                 B.Aggressiveness += 0.8;
  1591.  
  1592.                 // Find an enemy on another team
  1593.                 for ( PawnLinkD=Level.PawnList; PawnLinkD!=None; PawnLinkD=PawnLinkD.NextPawn )
  1594.                 {
  1595.                     // Do not process eliminated bots
  1596.                     if ( PawnLinkD.PlayerReplicationInfo.Score < 1 )
  1597.                         continue;
  1598.  
  1599.                     D = Bot( PawnLinkD );
  1600.                     if( PawnLink.PlayerReplicationInfo.Team != PawnLinkD.PlayerReplicationInfo.Team )
  1601.                     {    
  1602.                         // Different team so make it our enemy
  1603.                         if ( B.Enemy == None )
  1604.                             B.SetEnemy(D);
  1605.                     }
  1606.                 }        
  1607.             }
  1608.         }
  1609.     }        
  1610. }
  1611.  
  1612.  
  1613. function bool PickupQuery( Pawn Other, Inventory item )
  1614. {
  1615.     if ( Other.PlayerReplicationInfo.Score < 1 )
  1616.         return false;
  1617.     
  1618.     return Super.PickupQuery( Other, item );
  1619. }
  1620.  
  1621. function AddDefaultInventory( pawn PlayerPawn )
  1622. {
  1623.     local Weapon weap;
  1624.     local int i;
  1625.     local inventory Inv;
  1626.     local float F;
  1627.  
  1628.     if ( PlayerPawn.IsA('Spectator') || (bRequireReady && (CountDown > 0)) )
  1629.         return;
  1630.     Super.AddDefaultInventory(PlayerPawn);
  1631.  
  1632.     GiveWeapon(PlayerPawn, "Botpack.ShockRifle");
  1633.     GiveWeapon(PlayerPawn, "Botpack.UT_BioRifle");
  1634.     GiveWeapon(PlayerPawn, "Botpack.Ripper");
  1635.     GiveWeapon(PlayerPawn, "Botpack.UT_FlakCannon");
  1636.  
  1637.     if ( PlayerPawn.IsA('PlayerPawn') )
  1638.     {
  1639.         GiveWeapon(PlayerPawn, "Botpack.SniperRifle");
  1640.         GiveWeapon(PlayerPawn, "Botpack.PulseGun");
  1641.         GiveWeapon(PlayerPawn, "Botpack.Minigun2");
  1642.         GiveWeapon(PlayerPawn, "Botpack.UT_Eightball");
  1643.         PlayerPawn.SwitchToBestWeapon();
  1644.     }
  1645.     else
  1646.     {
  1647.         // randomize order for bots so they don't always use the same weapon
  1648.         F = FRand();
  1649.         if ( F < 0.7 ) 
  1650.         {
  1651.             GiveWeapon(PlayerPawn, "Botpack.SniperRifle");
  1652.             GiveWeapon(PlayerPawn, "Botpack.PulseGun");
  1653.             if ( F < 0.4 )
  1654.             {
  1655.                 GiveWeapon(PlayerPawn, "Botpack.Minigun2");
  1656.                 GiveWeapon(PlayerPawn, "Botpack.UT_Eightball");
  1657.             }
  1658.             else
  1659.             {
  1660.                 GiveWeapon(PlayerPawn, "Botpack.UT_Eightball");
  1661.                 GiveWeapon(PlayerPawn, "Botpack.Minigun2");
  1662.             }
  1663.         }
  1664.         else
  1665.         {
  1666.             GiveWeapon(PlayerPawn, "Botpack.Minigun2");
  1667.             GiveWeapon(PlayerPawn, "Botpack.UT_Eightball");
  1668.             if ( F < 0.88 )
  1669.             {
  1670.                 GiveWeapon(PlayerPawn, "Botpack.SniperRifle");
  1671.                 GiveWeapon(PlayerPawn, "Botpack.PulseGun");
  1672.             }
  1673.             else
  1674.             {
  1675.                 GiveWeapon(PlayerPawn, "Botpack.PulseGun");
  1676.                 GiveWeapon(PlayerPawn, "Botpack.SniperRifle");
  1677.             }
  1678.         }
  1679.     }
  1680.                 
  1681.     for ( inv=PlayerPawn.inventory; inv!=None; inv=inv.inventory )
  1682.     {
  1683.         weap = Weapon(inv);
  1684.         if ( (weap != None) && (weap.AmmoType != None) )
  1685.             weap.AmmoType.AmmoAmount = weap.AmmoType.MaxAmmo;
  1686.     }
  1687.  
  1688.     inv = Spawn(class'Armor2');
  1689.     if( inv != None )
  1690.     {
  1691.         inv.bHeldItem = true;
  1692.         inv.RespawnTime = 0.0;
  1693.         inv.GiveTo(PlayerPawn);
  1694.     }
  1695. }    
  1696.  
  1697. function ModifyBehaviour(Bot NewBot)
  1698. {
  1699.     // Set the Bot's Lives
  1700.     NewBot.PlayerReplicationInfo.Score = Lives;
  1701.  
  1702.     NewBot.CampingRate += FRand();
  1703. }
  1704.  
  1705. function bool OneOnOne()
  1706. {
  1707.     return ( NumPlayers + NumBots - NumGhosts == 2 );
  1708. }
  1709.  
  1710. ╪l*5ƒ╪╪:éw*÷*w.ε*÷*d*éé▒?;½½ÜÖ>?Æ║╣?*a/!p╤X╪*╤╤╓¢:ÿ╗:$*,:*ïæ ╬|a8^r L╦%╬aVó∙ó╒?Ü╔%,
  1711. J╔ åZW                  6z]»ⁿï(å▒ 5òçNvy┴à.Ω;√çNvy┴âªTî╘âªTî╘âªTî╘âªTî╘£╠j@ú«▓┘={«▓┘={╪╤╕ÖB«▓┘={╪╤╕ÖB£╠j@ú£╠j@ú£╠j@ú£╠j@úâªTî╘à.Ω;√ÉÆ╘√RâªTî╘âªTî╘âªTî╘à.Ω;√âªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘ÉÆ╘√RâªTî╘âªTî╘à.Ω;√çNvy┴çNvy┴ÉÆ╘√RâªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘à.Ω;√çNvy┴çNvy┴âªTî╘âªTî╘ë⌠¬¬æÉÆ╘√RâªTî╘âªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√ë⌠¬¬æâªTî╘à.Ω;√âªTî╘┬1╣≥p┬1╣≥p┬1╣≥pì·⌐¼    £╠j@úì·⌐¼    ì·⌐¼    £╠j@ú╙╥ùO≈ì·⌐¼    £╠j@úì·⌐¼    £╠j@ú╙╥ùO≈ÉÆ╘√RÉÆ╘√RâªTî╘à.Ω;√âªTî╘ÉÆ╘√RâªTî╘âªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘âªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘âªTî╘ùw·┴4ùw·┴4âªTî╘ùw·┴4âªTî╘âªTî╘âªTî╘âªTî╘âªTî╘âªTî╘âªTî╘ùw·┴4âªTî╘âªTî╘âªTî╘âªTî╘à.Ω;√âªTî╘âªTî╘âªTî╘âªTî╘âªTî╘ÉÆ╘√RâªTî╘âªTî╘çNvy┴çNvy┴âªTî╘ë⌠¬¬æë⌠¬¬æë⌠¬¬æô≤\÷├à.Ω;√ÉÆ╘√Rùw·┴4ùw·┴4ùw·┴4çNvy┴ùw·┴4ñ╤5>çNvy┴à.Ω;√çNvy┴ñ╤5>çNvy┴ñ╤5>çNvy┴ñ╤5>çNvy┴ñ╤5>çNvy┴çNvy┴ùw·┴4çNvy┴ì·⌐¼    çNvy┴ì·⌐¼    ùw·┴4çNvy┴çNvy┴çNvy┴çNvy┴çNvy┴┼ÇG⌠╖çNvy┴ùw·┴4çNvy┴ùw·┴4çNvy┴çNvy┴çNvy┴çNvy┴çNvy┴çNvy┴çNvy┴çNvy┴çNvy┴çNvy┴çNvy┴âªTî╘âªTî╘à.Ω;√âªTî╘çNvy┴à.Ω;√âªTî╘à.Ω;√âªTî╘┘f?b)çNvy┴à.Ω;√çNvy┴âªTî╘çNvy┴çNvy┴çNvy┴à.Ω;√ë⌠¬¬æÉÆ╘√RâªTî╘âªTî╘âªTî╘à.Ω;√çNvy┴à.Ω;√âªTî╘âªTî╘à.Ω;√âªTî╘çNvy┴ÉÆ╘√RâªTî╘âªTî╘âªTî╘à.Ω;√çNvy┴à.Ω;√âªTî╘à.Ω;√âªTî╘çNvy┴âªTî╘çNvy┴çNvy┴ë⌠¬¬æë⌠¬¬æë⌠¬¬æçNvy┴à.Ω;√çNvy┴à.Ω;√çNvy┴ùw·┴4çNvy┴ùw·┴4çNvy┴ùw·┴4çNvy┴çNvy┴ùw·┴4ùw·┴4¬q¥r¬q¥r¬q¥r¬q¥râªTî╘à.Ω;√ì·⌐¼    âªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√ë⌠¬¬æâªTî╘à.Ω;√âªTî╘à.Ω;√ë⌠¬¬æ¬q¥r¬q¥râªTî╘âªTî╘à.Ω;√ô≤\÷├âªTî╘à.Ω;√âªTî╘à.Ω;√ÉÆ╘√RâªTî╘âªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘âªTî╘à.Ω;√âªTî╘âªTî╘âªTî╘âªTî╘à.Ω;√ë⌠¬¬æë⌠¬¬æÉÆ╘√RÉÆ╘√RâªTî╘âªTî╘âªTî╘âªTî╘âªTî╘à.Ω;√ë⌠¬¬æë⌠¬¬æâªTî╘à.Ω;√âªTî╘à.Ω;√ë⌠¬¬æë⌠¬¬æâªTî╘à.Ω;√ë⌠¬¬æë⌠¬¬æâªTî╘à.Ω;√âªTî╘âªTî╘à.Ω;√¬q¥r¬q¥râªTî╘âªTî╘à.Ω;√¬q¥r¬q¥râªTî╘à.Ω;√âªTî╘╕¿ⁿª∞âªTî╘à.Ω;√âªTî╘à.Ω;√ë⌠¬¬æë⌠¬¬æë⌠¬¬æâªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘âªTî╘à.Ω;√âªTî╘┬1╣≥pâªTî╘âªTî╘âªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘çNvy┴âªTî╘ÉÆ╘√R╕¿ⁿª∞╕¿ⁿª∞âªTî╘âªTî╘à.Ω;√σE┼x8ÉÆ╘√Rùw·┴4¡    h║¡    h║ùw·┴4ÉÆ╘√RâªTî╘âªTî╘âªTî╘âªTî╘âªTî╘¡    h║âªTî╘¡    h║âªTî╘à.Ω;√¡    h║âªTî╘âªTî╘ë⌠¬¬æë⌠¬¬æë⌠¬¬æë⌠¬¬æë⌠¬¬æë⌠¬¬æÉÆ╘√RâªTî╘âªTî╘âªTî╘à.Ω;√âªTî╘âªTî╘çNvy┴çNvy┴çNvy┴ÉÆ╘√RâªTî╘âªTî╘âªTî╘âªTî╘▀#fInçNvy┴âªTî╘âªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√çNvy┴âªTî╘ë⌠¬¬æâªTî╘âªTî╘âªTî╘à.Ω;√ë⌠¬¬æÉÆ╘√Rô≤\÷├ô≤\÷├ô≤\÷├à.Ω;√ô≤\÷├ùw·┴4ô≤\÷├ùw·┴4ô≤\÷├ùw·┴4ô≤\÷├ô≤\÷├ùw·┴4ô≤\÷├à.Ω;√ô≤\÷├ô≤\÷├ÉÆ╘√Rô≤\÷├ô≤\÷├ô≤\÷├ô≤\÷├à.Ω;√ô≤\÷├½▄╖Ç≈ô≤\÷├à.Ω;√ô≤\÷├ô≤\÷├à.Ω;√ë⌠¬¬æô≤\÷├ô≤\÷├ÉÆ╘√Rô≤\÷├ÉÆ╘√RâªTî╘âªTî╘âªTî╘à.Ω;√âªTî╘à.Ω;√âªTî╘ë⌠¬¬æë⌠¬¬æë⌠¬¬æë⌠¬¬æë⌠¬¬æ╞┐D█ë⌠¬¬æÉÆ╘√RÉÆ╘√RâªTî╘ô≤\÷├à.Ω;√ë⌠¬¬æô≤\÷├ô≤\÷├ô≤\÷├ô≤\÷├âªTî╘âªTî╘¬q¥r¬q¥r¬q¥r¬q¥rô≤\÷├ô≤\÷├ô≤\÷├ÉÆ╘√Rô≤\÷├ô≤\÷├à.Ω;√ÉÆ╘√RâªTî╘âªTî╘âªTî╘âªTî╘«▓┘={└k 8ë⌠¬¬æë⌠¬¬æë⌠¬¬æë⌠¬¬æ└k 8|l╛F$t╙J"a]$#Make yours the last team standing.G"z]$#TLastManStanding.UTTeamLMSRSClientG]    LMSTeami]Last Man Standing Team Gameⁿsz~┌uJ4ä-┌%▒?;½½ÜÖ>?Æ║╣?(ûÆ║╣  ⌠^Eë╞vIK≤IwK*2Ka/!B-A'KK╤ ╘-A╤éééa/! w.£╧*üa/!üa/!6.£╧Θ*(;;ééa/! w.£╧*üa/!.£╧Θ*(⌠ Çtclass UTTeamLMSRSClient extends UWindowScrollingDialogClient;
  1712.  
  1713. function Created()
  1714. {
  1715.     ClientClass = class'UTTeamLMSRCWindow';
  1716.     FixedAreaClass = None;
  1717.     Super.Created();
  1718. }
  1719.  
  1720. ╘fi]%P⌠Qéé5-Γw.â5ï*.â5ï-▐(Åéiï-▐Ü:iïæ, 'ééw.â5*.â5-º8Ü:.â5ïæ:iïæ KÇ╥k*;@D¼ú @oæD»¼ú?,?@,\D«¼ú?,?o]ÉD¼ú?,,læD»ú?],~D»ú?,îYD»»ú?~?,(-╫(╥σw*#
  1721. Så░╡ójå░╡╒?w*-∙å░╡-╠∙\C└%C-╫(.⌐ ⌐?l┘?]Ç?s A&kD½å░╡╜?,
  1722. 
  1723. ?k$ ppps [SÉk,
  1724. %]: ]%-╫' ²G{:ó┘n▒?;½½ÜÖ>?Æ║╣?n ΓnéÖ▐·"ä¢:ÿ╗:$    ù║%Ñ·²{JIn¢r**≈ééw*üa/!üa/!ïí?²¡-τ8 =, {¡w8*a 8 ªa+8 ▒ Σ8 ▒. ▒8 '²:ïæ Ωo^╒εJ╘&r*τAdded none to team!!! T^ûÑTÖïæ=^ïτT╞¬w▓*▓ ╔w│*│ -G(-a/!    ï╩%.ô,:ïæFï╩&Mü-G-G')ÿ¿&w)*ééé)-ºw)3Ü:)ïæ:ïæ1Ü)ï╩ï╩-G())ÑmJü-GÑï╩F ╟,ï*TwqrZqr=^╠é-╨    ü-─ âδ~we┴╣«ÿ¿òw*~é-º>ärD*1▒ïíDïíDÑ,%û&·ûó≡▒û┤,┤,ûÑ⌐%iûó_é¢,╓%┤,┤û┤ ╟%(ÑΦδ¿¿α,╞▀╩«ÿ▐@@ÿ¿ñw*".ô}w"*'ü-╓^"Ü:"ïæ,╓"-∞'Zr"D"≈*n"≈D"mq!3Ñ├C' g:ÇÇô╥J+nKY╓_äÜΓ%6ûΓôæ:+ïæûÖ,&ÿ¿1w*éééa/!    3Ü:ïæ:+ïæüa/!▒ïí?%Ñ<är&*░├¼Ç??<&ÑY_w&*ÑΓ+!&' <%ÿ¿Çw*iéé-º3Ü:ïæ:+ïæ▒ïí?%ÑEiééw+a/!■.ç╩!Ñ<iär&*░├¼?&?<&Ñz╛éw&*░├¼?<?E+!&' +!*' ┬dPDWq
  1725. φΘPD¼ú @aæD»¼ú?,?P,tD«¼ú?,?amÉD¼ú?,,WæD»ú?m,░-Ω.¼ ¼?a┘?PÇ? U ^%°$ßéüa░╡ ┌üa░╡ ▄.¢ ¢?t┘?PÇ? T S%'r,°$L'╕┘?, ╠e9gC╩#╕╠97ä9a/!9a/! ª:9ïæûÖ9öééü-┌-╨    ü-─╢ärd*w9d ≥qi+A╝,é-─¢:ïæ, (U▒?;½½ÜÖ>?Æ║╣?(:%┼û:ó╗är#*%ù#Ö:ûÖf:#:ûÑ:\æé-╠¢:ÿ╗:$6Ü╣&ÿ¿?w*(a/!?Ñ╪ééw*wï*8Ü:ïæûÖ#Öïæ=, :ïæ33äÖó%ùûÖ#Öïæ=, , ææäÖó%ùûÖ#Öïæ=, , ╣äÜ, Öóf.a/!ïæ=, w▓*▓ &w│*│ 'ªa/!ïæ=w▓*▓ ₧w│*│ '╒éÜ:ïæ-·(■a/!#.╕█*Q¢:ïæ, ª:ïæûÖüûûÖ╔'╕éw#*û#Ö╔f'( ▄nHuWδ%MC$Gû:Có=z:Cû╞HCïC=,  ≤yS46Z;╒Ñ%Σê▒%ïí?%╣%ïí?&êé%a/!    ░%ïí?&%┤éwS%    wS*ÑSπ≤S% DÇçt╙mQFìç{╙QPRVD¼ú @WæD»¼ú?,?V,uD«¼ú?,?WYÉD¼ú?,,yæD»ú?Y,┼w*µ?VÇ?╒?W6w*µ?VÇ?w*╒?u"╒?W╙áAµ?YÇ?φ┤B╒?y @ ┐ÿ{║ -┌ X, _%b%-c( ÿ¿ w *⌠ -ºé░ ïí?&Ñb⌠₧ a/!    -c'╦ÜX, X: ïæ⌠⌠¢X: ïæÑ_  Ñ=Nû_&τCheckEndGame: One Team Leftdteamscorelimit╕╕ü-c ÿ¿╕w *Ö░ ïí?&í@.ç íw@*@╤╕@ⁿ═╠L?/ÿ¿íw/*░/ïí?&è.ç/è¢: ïæ:/ïæèr@δ*@ I//ѱ  Ñm FÇ@ Ç─|NO"):mv╔╔%+p-ºÑ;─NpFτInside Killed Function╔v ÇCÇ╧ALK  7µL╧LL6=1r=*L▐éééw=66-º=-º3Ü:6ïæ:=ïæ╠6a/!.ç6 C=D½?L╜ΣL ⌠p[g['wä-ß    Ü╣% A▒?;½½ÜÖ>?Æ║╣? [%Z%B%ûÖE%ûÖ&$ûó╫ùûÖB[BûÖûûÖEZEûÖÑé-ß'8ùôBE&ÿ¿╙w*╝éé-º Ü:ïæ[a/!?.ç╙ÑR2w?*?╘%?D*!W? ªªBÑE?Z58,-ß(ÿ¿uw*^éé-ºa/!$■.▀ï╠!A.â.ç╚^ääärA*A-÷üA-º3¢:Aïæ:ïæ.ç╚*.çÑT ╫u|@╡Ékü-╫ ╫|CC
  1726. f$|
  1727. A"f
  1728. Rf
  1729. c!f
  1730.  
  1731.    ±}3 ».:téééé-▌    w3*3a/!#Ü:ÿ╗:$w.╕3█*.╕3█╡éw3*w3ï*23ïæ└2M■{z/a0 σg²ⁿ|WgΣz0g10Ü:2, 2$Jÿ∞µwJ*.¡J╧ééw*-²%äü-τÜ:2:α¬û,╚╚ûº,º,ÑJJ∩'ûÜ%τ¿¿Didn't find any player starts in list for teamR2!!!/a0 ¡êbû,ÇÇûº,º,Ñ10ûÜ%*¬ù,,%ûΘr┬$Ç╗┼■$½zE├Ñ▒ÿ¿╢w*ƒéé-ºù╘%üa/!%ƒûòr6≡ Ω6≡ Ω╣$?▄Mß╪ ª ª░M½?,«┴└╣$$tIòòéé░M?╨!¢:ïæ:2&b$ ª ª╣$»@FMÑnÑe%$O%&'û▒$ee$OÑ╫┬OO ├jtP j( @!╤&/å░╡-╠-∙ C╓└ç/ùJj
  1732. SjXûJ,    
  1733. 2å░╡óJ "D"σlå░╡╜¼?,
  1734. 0 ppps [SD½?,
  1735. %]: ]l]|^    F]^    ^■   u^■   ]K^°   @^ⁿ   qq²   ]+^    D^ⁿ   b^ⁿ   y^    `e√   {^■   p^        ^    X]Hq·   }^    ~q≤   Ab≈   D^⌠   d^⌠   d^     ^ⁿ   W^δ   d^δ   e^ⁿ   at√   bb·   Atµ   j^■   Sq²   kg≤   HW²   \q≡   ^^⌠   _^    ]^ⁿ   ^^⌠   b^    x^    _q∙   Hqß   ig≤   @q∞   Vq∞   [t≈   bjΓ   O^╔   \]M^■   #bε   Ob∞   Pe≡   p^ⁿ   tt·   R^ⁿ   ]^ⁿ   e^■   l^■   k^    u^⌠   `W┐   s^    Va≈   St·   Fq∙   Gbε   Mb√   \bε   NW·   @e▄   Nb·   TqΣ   }W·   fa∞   ic┬   ~^    |b²   gtµ   hb≈   ZWß   j^    6tß   rW∞   `q╚   l^■   Oq╥   W√   c^■   m^ⁿ   ^W·   Ab·   ^⌠   cg²   @^    wyµ   eW·   Pq∞   ^q¡   {g≤   Wq²   [q≡   sq≤    t²   QqΘ   zqà   e^⌠   aW≤   [q∞   Uy∞   Ey∞   bqφ   Uqφ   fe¥   gW╘   ab∞   Lc≤   It∙   {y·   :y╜   *bε   uy·   9yε   -qε   xWε   uyε   OW∙   F^    ^^■   p^ⁿ   Yb·   BY∙   }y·   `y·   gy·   By·   8y·   K^ⁿ   jt∙   Ey╩   *y╩   Fy·   cb·   Yyε   7y╩   @y·   5^■   x^■   J^■   G^■   Ny·   jb∞   aW∞   Me╙   |^■   vW≤   `b²   Ib²   H^    wt≤   _a√   Se«   syß   DWΓ   baz   EW∞   _t╫   k^    rW√   Vy∞   @y·    y·   y·   4y·   WΘ   yW≤   iy·   @y·   Ey·   xbε   iW∙   ry·   _W╙   zy·   [e«   |tÅ   ng≤   XY²   Ry·   P^ⁿ   gy·   N^■   bqε   yb¿   Cy·   {tε   ztΣ   oYí   tgñ   ze≤   Syε   Yy·   q╛   hy·   tσ   iy·   ]t²   EWε   Rbε   Cy·   y·   vWε   vWΣ   Dy·   uWε   wt≡   naε   ca·   By·   h^■   pg≤   ZY≤   [q└   }y·   \Wε   Caε   ab└   Fy·   y·   eW²   Pb¿   Be▄   {aε   hy·   Laε   Laε   \yε   Qy·   A^■   oa·   za·   da·   etÅ   oW·   Qyε   fyε   ~b·   Cy·   Hj╜   Zt≤   Zt≤   Ky╩   Dj╜   ]e«   NW∙   qè│t}lè╧    Kmèó`YmÄQ gmè∩Gsmè∞d@nè²dMnèµG[nè¡Uinè¡~vnè╩[Coè÷fPoèσm]oá░W joÄBvoÄ∩VCpèómPpèΦd^pè╟mlpèóaypÄ╝Q GqèLSqè╧y`qè▀GnqÄΦQ |qèIHrè╩lVrèrdrIJQqrÄ▌P ~rè∩dJsÄ╟QWsè╡~dsèΦUqsè∩W~s╝bKtè±GXtè∞Retè½Grtè└f@uèµdNuè█m\uè∞[iuèΦDvuè½~Cvè¬dPvè÷f]vè¼dkvè│dxv┐{EwèURwÄ╩Q`wèΓfmwèⁿw{wè╛]HxèσlUxèεlbxÄ∩QoxÄ▌Q|xÄ∞BIyèⁿAVyè│ldyè²|ryè÷|yè²YMzIJGZz┐≡QgzèΦ^tzIJH A{Ä╩U M{¥µqY{è╧xf{ĪQ t{èU@|è▀QM|ÄⁿS\|╝K i|èªDu|è^C}ÄφfP}─╟O]}╝╧T k}è±Tw}èµXD~Ä└Q Q~Ä⌡f]~Ä⌡gj~Ä÷g w~Ä⌡tCIJF PIJE\¥│v iÄΣtuĵB BÇÄ÷VNÇ╝½Y [ÇÄφggÇÄ▌RtÇ¥÷WAüè▌jNü╝J\üÄ∩MiüèpvüÄ╩J EéèΓvQéÄóY ^éÄΣnjéÄΣswéÄφtDâ╨σ]QâÄΣg`âè∙GmâáµF{âáµ HäáónTäÄφhaäÄ⌡hnäÄ∙U {äè╒[GàÄ╓~TàÄ⌡saàáqnàáσ\{àècHåè╦GWåÄΣkeåè÷mråÄΣf@ç¥▀T Mçè╩IYç┐ngçè»StçÄ∞X Aê╚∙VMêè╤GZêá≡ShêáσZuêáσXBëÄ╤~Oë╚ⁿV \ë┐ohëè∙Tvëè¬KDè╝⌡_Qèè⌡c^è╝⌡Tmèáó? zèáó<Fïáó=Sïá▄Z `ïÄφslïá▌S yïÄΣl Eîè»|Qîè»{_îÄΣhnîáóo {îáó>Gìè╦NTì¥▌O bìá▄Xnì╢qT{ì┐⌐JO¥Å■▌HD\¥¥ªJ`₧Å┘▌vNm₧è⌐~{á¥J IíÅß▌h"UíÅ╨▌pwíÅ■▌[ngúÅ╓▌7]U¿Å°▌EBr⌐è┴Mt▒Å═▌B]B▓Å≈▌@~_│á░J ]╖èJi╖Å╧▌YF    v╖è~|└Å╔▌{\J┴Å≡▌L!f├Å▌▌j!G─¥╖J h─è╢~t─¥▐J B┼¥╢J N┼Å└▌9jZ┼╨»}D╚Å╦▌`xT╚è┴LL╦Å▌rZ╦Å┼▌N!L╬¥┴J m╬Å╪▌!y╬è├JZ╧├J[g╧¥ΦJ B╤Åⁿ▌_gN╤Å╘▌c1u╓┐½Jf╫Å∙▌xOt╫Å⌡▌bBC▀¥╤J Eα¥│J Qα¥╦J ]αÅ┴▌-i iααóP4xhRφŵ▌\;J╓Ä╧Q E╫è╖~Q╫è╓J_╫Å≤▌Q@l╫Å⌠▌A5l╪Å√▌f/a┘¥╫J P┌Å■┼*,\┌α▌P4G»H█Å╪▌5oOèÅ╬▌8N~îå{JLÄÅⁿ▌~QG┘Å⌠▌EJX┌¥ΓJ b▐α┼P4n▐Å╘▌]Fmߥ▀JsΣÅ╥ó*e@σŲ▌:UeδÅΩ▌Dz≡è∩t~°Åδ▌eYK∙Ä∩UdÇ¥∩J qÇèσJ}ÇÅ╥▌DJüÅ┬óDhNëÅ╠▌g[vÄÅ≥▌s QæÅ▄▌uVD₧Å≤▌4mZƒè├~GóÄφkUóÄφl bóÅ╙óFmnóÅ▌J[ºáΦYe»¥╩J r»Å─▌Om~»ÄⁿJ k▒┐≡Jw▒Å╧▌KtE▓Å⌠▌f    y┤Ä⌡k_╛Ä⌡l l╛Å╫ó@jx╛ű▌ yb└Å├▌P![╧Åó!9|╧Åósu╨Åó"fh╥[Public]
  1736. Object=(Name=TLastManStanding.TLastManStanding,Class=Class,MetaClass=Botpack.TournamentGameInfo)
  1737. Preferences=(Caption="Team LMS",Parent="Game Types",Class=TLastManStanding.TLastManStanding,Immediate=True)
  1738. Team Last Man Standing for Unreal Tournament
  1739. ============================================
  1740.  
  1741. Author            : Connor "RiEvEr" Caple
  1742. Version            : 1.00
  1743. Release date    : 7th January 2000
  1744. Contact            : riever@botgod.org.uk
  1745.  
  1746. Type of Mod        : New TeamPlay GameType
  1747. Map types used    : DM- series (Same as LastManStanding)
  1748. Bot Play        : Yes
  1749. Internet Play    : Yes
  1750.  
  1751. Installation
  1752. ------------
  1753.  
  1754. If this came as a umod file, then just double click the file and it'll install for you. If
  1755. it's a zip file (yech) then you need to read the next bit:
  1756.  
  1757. UTLastManStanding.txt    This file you are reading now
  1758. UTLastmanStanding.u        The mod file goes in yout UT/system/ folder
  1759. UTLastManStanding.int    The int file goes in your UT/system/ folder
  1760.  
  1761. Start UT and you should see "Last man Standing Team Game" appear as an option on the gametypes
  1762. menu ( Where you see CTF, Assault, Deathmatch, etc. listed).
  1763.  
  1764. How To Play
  1765. -----------
  1766.  
  1767. Start a new match (local or net) and select the "Last Man Standing Team Game" from the available
  1768. game types in the drop down menu.
  1769.  
  1770. Set the FragLimit and MaxTeams from the rules menu. The FragLimit is the amount of lives for
  1771. each INDIVIDUAL team member and these are totalled to find the team score. You may play the
  1772. game with 2, 3 or 4 teams (default is 2).
  1773.  
  1774. Add bots if you want any from the bot menu.
  1775.  
  1776. Launch the game and kill your opponents.
  1777.  
  1778. The game uses the TeamPlay HUD, your HUD will appear in your team colour. Team icons will appear
  1779. at the side of the screen with the current total team score displayed. This number will reduce
  1780. every time a team member dies. Once it reaches ZERO that team is eliminated.
  1781. Your personal "Lives" will be shown as Frags in the corner of the screen and will start at
  1782. FragLimit and count down to ZERO when YOU will be eliminated, your team must then fight on without
  1783. you. The last team with any members still standing are the winners. This will be announced the
  1784. same way it is in Team Games.
  1785.  
  1786. In case anyone was wondering, there is NO point writing this mod to use a TeamScoreLimit since
  1787. that would just be exactly the same as a TeamDeathmatch but counting the score in reverse *yawn*.
  1788.  
  1789. The implemented method means that a good player can still save a poor team from defeat and that 
  1790. a poor player cannot drag the whole team down with them, as often happens in TeamDeathmatch!
  1791.  
  1792. Menu Alterations
  1793. ----------------
  1794.  
  1795. I coded a new menu layout for the GameRules since this mod works by adding up each individual
  1796. player's FragLimit, _not_ by using a TeamScoreLimit.
  1797.  
  1798. Bot AI Adjustments
  1799. ------------------
  1800.  
  1801. Once the last "human" player has died, the bots will become hyper-aggressive and stop all camping.
  1802. This is deliberate, I coded it to mimic their behaviour in normal LMS games. The aim of this change
  1803. is to get the game over with quickly so we don't bore the human players to death who are watching.
  1804.  
  1805. Why I Did It?
  1806. -------------
  1807.  
  1808. I wanted to find out how to code mods for Unreal Tournament and, I always find, the best way of 
  1809. learning something is to do it. I originally coded this as a new gametype extending DeathMatchPlus
  1810. like LMS does, I then (next day) started it again from scratch and coded it as an extension of
  1811. TeamDeathMatch since this involved less menu work.
  1812.  
  1813. What Else Have I Made?
  1814. ----------------------
  1815.  
  1816. You probably don't care, but just in case you wondered here are some of my past bots/mods:
  1817.  
  1818. Quake:
  1819.     HolyWars TutorBot
  1820. Quake II:
  1821.     Dronebot
  1822.     Licensed To Kill (Action Q2 bot)
  1823.     Michael (Holywars II bot)
  1824. KingPin:
  1825.     The Kraze! bots
  1826.     Last Thug Standing mod
  1827. SiN:
  1828.     ReDeMpTiOn bots
  1829.     ReDeMpTiOn SiN Arcade Machine
  1830.     SiNMod ( Last Man Standing and 1 on 1 Arena mod)
  1831.  
  1832. $Header: /UT/TLastManStanding.txt 3     7/01/00 7:41 Riever $
  1833. System\Manifest.iniSSystem\Manifest.intSSystem\TLastmanStanding.umh.System\TLastManStanding.int╒2┘&TLastManStanding\TLastManStanding.txt«3óú┼πƒPB*Cîp╗ó